+3

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**kwargs không cần thiết

Mặc dù *args**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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí