Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
8 Mẹo Refactor Code Python nhanh gọn (Phần 2)
Refactor code là một kỹ năng quan trọng giúp tối ưu hóa, làm gọn mã nguồn và cải thiện khả năng đọc cũng như bảo trì của chương trình. Trong Python, với sự hỗ trợ của các cú pháp hiện đại và thư viện phong phú, việc viết code Pythonic trở nên dễ dàng hơn bao giờ hết. Bài viết này tiếp tục phần 2 trong chuỗi hướng dẫn về refactor, mang đến 8 mẹo nhỏ nhưng hiệu quả để giúp bạn viết code ngắn gọn, sạch sẽ và chuyên nghiệp hơn.
Gộp append
vào khai báo danh sách trong Python
Thay vì khởi tạo một danh sách rỗng và sau đó sử dụng append
để thêm phần tử, hãy khai báo trực tiếp danh sách với các phần tử ban đầu. Cách này vừa ngắn gọn, dễ hiểu, lại còn hiệu quả hơn vì giảm được các lệnh gọi hàm append()
.
# Trước players = [] players.append("Patrick") players.append("Max") players.append("Jessi") # Sau (refactor) players = ["Patrick", "Max", "Jessi"]
Tương tự, cách này cũng áp dụng cho các kiểu dữ liệu tập hợp (set
) và từ điển (dictionary
).
2. Sử dụng items()
để lấy cả key và value trong từ điển trong Python
Khi duyệt qua một từ điển và cần cả key
lẫn value
, hãy sử dụng phương thức items()
thay vì truy xuất thủ công. Cách này giúp code ngắn gọn, dễ hiểu hơn.
Bài viết này được đăng tại [free tuts .net]
# Trước teams_by_color = {"blue": ["Patrick", "Jessi"]} for team_color in teams_by_color: players = teams_by_color[team_color] if is_winning(team_color): advance_level(players) # Sau (refactor) for team_color, players in teams_by_color.items(): if is_winning(team_color): advance_level(players)
3. Thay range(len)
bằng enumerate
trong Python
Khi cần cả chỉ số và giá trị trong danh sách, thay vì dùng range(len)
, hãy sử dụng enumerate()
. Hàm này trả về cặp (index, item)
giúp code dễ đọc hơn.
# Trước for i in range(len(players)): print(i, players[i]) # Sau (refactor) for i, player in enumerate(players): print(i, player) # Có thể bắt đầu từ 1 thay vì 0 for i, player in enumerate(players, start=1): print(i, player)
4. Thay thế bộ đếm thủ công bằng enumerate
trong Python
Nếu bạn phải tự tăng biến đếm trong vòng lặp, hãy thay thế nó bằng enumerate
để làm code đơn giản hơn.
# Trước i = 0 for player in players: print(i, player) i += 1 # Sau (refactor) for i, player in enumerate(players): print(i, player)
4.1. Đừng đếm thủ công số lượng phần tử
Nếu chỉ cần đếm số lượng phần tử, dùng trực tiếp hàm len()
thay vì duyệt qua vòng lặp.
# Trước num_players = 0 for player in players: num_players += 1 # Sau (refactor) num_players = len(players)
5. Đơn giản hóa điều kiện trả về trong Python
Thay vì sử dụng câu lệnh if...else
để trả về True
hoặc False
, bạn có thể trả về kết quả điều kiện trực tiếp nếu giá trị là Boolean.
# Trước def function(): if isinstance(a, b) or issubclass(b, a): return True return False # Sau (refactor) def function(): return isinstance(a, b) or issubclass(b, a)
Đối với các giá trị không phải Boolean, bạn có thể dùng hàm bool()
để đảm bảo đầu ra là giá trị đúng kiểu.
# Trước def any_pythonistas(): pythonistas = [coder for coder in coders if is_good_in_python(coder)] if pythonistas or self.is_pythonista(): return True return False # Sau (refactor) def any_pythonistas(): pythonistas = [coder for coder in coders if is_good_in_python(coder)] return bool(pythonistas or self.is_pythonista())
6. Gộp các khối điều kiện trùng lặp trong Python
Nếu các khối lệnh trong if...elif
giống nhau, hãy gộp chúng lại bằng cách dùng toán tử or
.
# Trước def process_payment(payment, currency): if currency == "USD": process_standard_payment(payment) elif currency == "EUR": process_standard_payment(payment) else: process_international_payment(payment) # Sau (refactor) def process_payment(payment, currency): if currency == "USD" or currency == "EUR": process_standard_payment(payment) else: process_international_payment(payment)
6.1. Sử dụng toán tử in
thay cho nhiều so sánh
Thay vì so sánh một biến với nhiều giá trị, bạn có thể sử dụng toán tử in
để rút gọn code. Hơn nữa, dùng set
sẽ tốt hơn danh sách vì hiệu suất tra cứu nhanh hơn.
# Sau (cải tiến thêm) def process_payment(payment, currency): if currency in {"USD", "EUR"}: process_standard_payment(payment) else: process_international_payment(payment)
7. Dùng yield from
thay cho vòng lặp yield
trong Python
Khi làm việc với generator, nếu bạn cần yield
từng phần tử trong một iterable, hãy sử dụng yield from
thay vì lặp thủ công.
# Trước def get_content(entry): for block in entry.get_blocks(): yield block # Sau (refactor) def get_content(entry): yield from entry.get_blocks()
8. Cài đặt tiện ích refactor tự động trong Python
Bạn có thể cài đặt extension Sourcery trên VS Code hoặc PyCharm để nhận gợi ý refactor trực tiếp khi viết code. Sourcery hoàn toàn miễn phí và giúp phát hiện các mẫu refactor phổ biến.
Kết bài
Refactor code không chỉ giúp tối ưu hóa hiệu suất mà còn nâng cao tính dễ hiểu và dễ bảo trì của chương trình. Với 8 mẹo refactor Pythonic được chia sẻ trong bài viết, hy vọng bạn sẽ áp dụng hiệu quả vào dự án của mình để tạo ra những đoạn code ngắn gọn, rõ ràng và chuẩn mực hơn. Đừng quên rằng việc luyện tập thường xuyên và cập nhật kiến thức mới sẽ giúp bạn ngày càng thành thạo trong việc viết code chuyên nghiệp.