Bí kíp Python: Viết code "sạch" và sang!
Code sạch là yếu tố then chốt để ứng dụng Python dễ quản lý và mở rộng. Bài viết này sẽ giới thiệu mười lăm mẹo để viết code Python sạch hơn, đồng thời tăng khả năng đọc hiểu, hiệu quả và khả năng bảo trì.
1. Sử dụng tên biến và tên hàm có ý nghĩa
Trong Python, tên biến nên phản ánh mục đích của chúng. Tránh các biến ký tự đơn hoặc tên mơ hồ.
VD không tốt:
x = 10
Nên sửa lại thế này:
item_count = 10
2. Giữ cho các hàm nhỏ và tập trung
Python cho phép linh hoạt, nhưng cách tốt nhất là giữ cho các hàm của bạn nhỏ và tập trung. Mỗi hàm chỉ nên làm một việc.
VD không tốt:
def process_data():
fetch_data()
validate_data()
save_data()
Nên sửa lại như sau:
def fetch_data():
pass
def validate_data():
pass
def save_data():
pass
3. Sử dụng định dạng nhất quán
Thụt lề rất quan trọng trong Python, vì nó xác định các khối mã. Tuân thủ 4 khoảng trắng cho mỗi cấp độ thụt lề (tiêu chuẩn PEP 8). Một phong cách nhất quán giúp code của bạn dễ theo dõi hơn.
VD không tốt:
if x:
print("Hello")
else:
print("Goodbye")
Nên sửa lại như sau:
if x:
print("Hello")
else:
print("Goodbye")
4. Tránh số ma thuật (Magic Numbers)
Tránh sử dụng các số tùy ý trực tiếp trong code. Thay vào đó, hãy sử dụng các hằng số với tên mô tả.
VD không tốt:
area = 3.14 * radius * radius
Nên sửa lại như sau:
PI = 3.14
area = PI * radius * radius
5. Sử dụng tham số mặc định
Python cho phép các giá trị mặc định cho các tham số hàm. Điều này làm giảm nhu cầu về điều kiện và làm cho các hàm của bạn ngắn gọn hơn.
VD không tốt:
def greet(name):
if not name:
name = 'Guest'
print(f"Hello {name}")
Nên sửa lại như sau:
def greet(name="Guest"):
print(f"Hello {name}")
6. Giảm thiểu các vòng lặp và điều kiện lồng nhau
Khả năng đọc của Python bị ảnh hưởng bởi việc lồng nhau quá nhiều. Giảm thiểu việc lồng nhau bằng cách trả về sớm hoặc bằng cách chia nhỏ logic thành các hàm nhỏ hơn.
VD không tốt:
if x:
if y:
if z:
print("Condition met!")
Nên sửa lại như sau:
if not x or not y or not z:
return
print("Condition met!")
7. Tận dụng các hàm tích hợp sẵn của Python
Python cung cấp các hàm và thư viện tích hợp mạnh mẽ. Đối với các tác vụ phổ biến, hãy sử dụng các công cụ tích hợp sẵn này thay vì tự viết logic của bạn.
VD không tốt:
squared_numbers = []
for num in range(1, 6):
squared_numbers.append(num ** 2)
Nên sửa lại như sau:
squared_numbers = [num ** 2 for num in range(1, 6)]
8. Tránh biến toàn cục
Trong Python, các biến toàn cục có thể dẫn đến hành vi không mong muốn và gây khó khăn cho việc gỡ lỗi. Giữ các biến trong các hàm hoặc sử dụng các lớp nếu cần.
VD không tốt:
counter = 0
def increment():
global counter
counter += 1
Nên sửa lại như sau:
class Counter:
def __init__(self):
self.counter = 0
def increment(self):
self.counter += 1
9. Sử dụng List Comprehensions
List Comprehensions là một cách Pythonic để tạo danh sách. Chúng gọn nhẹ, dễ đọc và hiệu quả hơn so với việc sử dụng vòng lặp.
VD không tốt:
numbers = []
for i in range(1, 6):
if i % 2 == 0:
numbers.append(i)
Nên sửa lại như sau:
numbers = [i for i in range(1, 6) if i % 2 == 0]
10. Viết chú thích và Docstrings
Các nhà phát triển Python dựa vào docstrings và chú thích để làm tài liệu. Mặc dù bản thân code nên tự giải thích, nhưng hãy sử dụng docstrings để mô tả các hàm và lớp, và thêm chú thích khi logic phức tạp.
VD không tốt:
# Increment counter
counter += 1
Nên sửa lại như sau:
def increment_counter(counter):
"""
Increments the counter by 1.
Arguments:
counter -- the current count to be incremented.
"""
return counter + 1
11. Xử lý ngoại lệ đúng cách
Thay vì để chương trình của bạn bị sập khi có sự cố, hãy xử lý các ngoại lệ đúng cách. Nó cải thiện tính ổn định của code.
VD không tốt:
num = int(input("Enter a number: "))
print(10 / num)
Nên sửa lại như sau:
try:
num = int(input("Enter a number: "))
print(10 / num)
except ValueError:
print("Invalid input, please enter an integer.")
except ZeroDivisionError:
print("Cannot divide by zero!")
12. Tránh sử dụng *args
và **kwargs không cần thiết
Mặc dù *args
và **kwargs
rất mạnh mẽ, nhưng chúng nên được sử dụng một cách thận trọng. Việc sử dụng chúng không cần thiết có thể làm cho các lệnh gọi hàm của bạn trở nên khó hiểu.
VD không tốt:
def add_numbers(*args):
return sum(args)
Nên sửa lại như sau:
def add_numbers(a, b):
return a + b
13. Sử dụng Type Hints
Thêm type hints giúp code dễ hiểu hơn và giúp các công cụ như linters và IDE cung cấp hỗ trợ tốt hơn.
VD không tốt:
def add_numbers(a, b):
return a + b
Nên sửa lại như sau:
def add_numbers(a: int, b: int) -> int:
return a + b
14. Hạn chế tác dụng phụ trong các hàm
Tác dụng phụ (ví dụ: sửa đổi biến toàn cục hoặc trạng thái của đối tượng) có thể làm cho code khó hiểu hơn. Cố gắng giảm thiểu chúng và giữ cho các hàm pure bất cứ khi nào có thể.
VD không tốt:
x = 10
def add_ten():
global x
x += 10
add_ten()
Nên sửa lại như sau:
def add_ten(x: int) -> int:
return x + 10
x = 10
x = add_ten(x)
15. Sử dụng câu lệnh with
của Python để quản lý tài nguyên
Quản lý tài nguyên như tệp, cơ sở dữ liệu hoặc kết nối mạng, hãy sử dụng câu lệnh with
để đảm bảo chúng được đóng hoặc dọn dẹp đúng cách.
VD không tốt:
file = open('example.txt', 'r')
data = file.read()
file.close()
Nên sửa lại như sau:
with open('example.txt', 'r') as file:
data = file.read()
16. Tránh sử dụng eval()
eval()
có thể nguy hiểm vì nó thực thi mã tùy ý. Nó thường không cần thiết và nên tránh vì lý do bảo mật.
VD không tốt:
user_input = input("Enter a Python expression: ")
result = eval(user_input)
print(result)
Nên sửa lại như sau:
user_input = input("Enter a number: ")
try:
result = int(user_input)
print(result)
except ValueError:
print("Invalid input, please enter a valid number.")
17. Tránh lặp lại (Nguyên tắc DRY)
Đừng lặp lại chính mình (DRY - Don't Repeat Yourself) là một nguyên tắc khuyến khích sử dụng các hàm, lớp hoặc các dạng trừu tượng khác để tránh code dư thừa.
VD không tốt:
def calculate_area(radius):
return 3.14 * radius * radius
def calculate_circumference(radius):
return 2 * 3.14 * radius
Nên sửa lại như sau:
PI = 3.14
def calculate_area(radius):
return PI * radius * radius
def calculate_circumference(radius):
return 2 * PI * radius
18. Sử dụng Enumerate thay vì Range
Khi lặp qua một danh sách và cần cả chỉ mục và mục, hãy sử dụng enumerate()
để tránh lập chỉ mục thủ công.
VD không tốt:
for i in range(len(my_list)):
print(i, my_list[i])
Nên sửa lại như sau:
for i, item in enumerate(my_list):
print(i, item)
19. Nhóm code liên quan thành các lớp
Nếu code của bạn có các hàm liên quan, thường nên nhóm chúng thành các lớp. Điều này đóng gói các hành vi liên quan và làm cho code có tổ chức hơn.
VD không tốt:
def calculate_area(radius):
return 3.14 * radius * radius
def calculate_circumference(radius):
return 2 * 3.14 * radius
Nên sửa lại như sau:
class Circle:
PI = 3.14
def __init__(self, radius):
self.radius = radius
def calculate_area(self):
return self.PI * self.radius * self.radius
def calculate_circumference(self):
return 2 * self.PI * self.radius
Viết code sạch trong Python không chỉ là việc tuân theo các phương pháp hay nhất — mà còn là việc làm cho code của bạn dễ đọc, bảo trì và mở rộng. Bằng cách áp dụng những mẹo này, bạn sẽ đang trên đường viết code Python vừa hiệu quả vừa sạch sẽ.
Hy vọng bài viết này giúp ích cho các bạn trên con đường lập trình.
All rights reserved