× Giới thiệu Lịch khai giảng Tin tức Sản phẩm học viên

Cách viết mã Python nhanh chóng, gọn gàng với PEP 8

22/04/2022 13:29

PEP 8, đôi khi được đánh vần là PEP8 hoặc PEP-8, là tài liệu cung cấp các hướng dẫn và phương pháp hay nhất về cách viết mã Python. Nó được viết vào năm 2001 bởi Guido van Rossum, Barry Warsaw và Nick Coghlan. Trọng tâm chính của PEP 8 là cải thiện khả năng đọc và tính nhất quán của mã Python.

PEP 8, đôi khi được đánh vần là PEP8 hoặc PEP-8, là tài liệu cung cấp các hướng dẫn và phương pháp hay nhất về cách viết mã Python. Nó được viết vào năm 2001 bởi Guido van Rossum, Barry Warsaw và Nick Coghlan. Trọng tâm chính của PEP 8 là cải thiện khả năng đọc và tính nhất quán của mã Python.

PEP là viết tắt của Đề xuất cải tiến Python, và có một số trong số đó. PEP là tài liệu mô tả các tính năng mới được đề xuất cho Python và các khía cạnh tài liệu của Python, như thiết kế và phong cách, cho cộng đồng.

Hướng dẫn này phác thảo các nguyên tắc chính được trình bày trong PEP 8. Nó nhằm vào các lập trình viên mới bắt đầu đến trung cấp, và do đó tôi chưa đề cập đến một số chủ đề nâng cao nhất. Bạn có thể tìm hiểu về những điều này bằng cách đọc tài liệu PEP 8 đầy đủ .

Tại sao chúng ta cần PEP 8

“Số lượng khả năng đọc”.

- Thiền của Python

PEP 8 tồn tại để cải thiện khả năng đọc của mã Python. Nhưng tại sao khả năng đọc lại quan trọng như vậy? Tại sao viết mã có thể đọc được là một trong những nguyên tắc hướng dẫn của ngôn ngữ Python?

Như Guido van Rossum đã nói, "Mã được đọc thường xuyên hơn nhiều so với khi nó được viết." Bạn có thể dành vài phút hoặc cả ngày để viết một đoạn mã để xử lý xác thực người dùng. Một khi bạn đã viết nó, bạn sẽ không bao giờ viết nó nữa. Nhưng chắc chắn bạn sẽ phải đọc lại. Đoạn mã đó có thể vẫn là một phần của dự án bạn đang thực hiện. Mỗi khi bạn quay lại tệp đó, bạn sẽ phải nhớ mã đó làm gì và tại sao bạn viết nó, vì vậy khả năng đọc rất quan trọng.

Nếu bạn là người mới làm quen với Python, có thể khó nhớ những gì một đoạn mã thực hiện trong vài ngày hoặc vài tuần, sau khi bạn viết nó. Nếu bạn làm theo PEP 8, bạn có thể chắc chắn rằng bạn đã đặt tên tốt cho các biến của mình . Bạn sẽ biết rằng mình đã thêm đủ khoảng trắng để làm theo các bước hợp lý trong mã của mình dễ dàng hơn. Bạn cũng sẽ nhận xét tốt mã của mình. Tất cả điều này sẽ có nghĩa là mã của bạn dễ đọc hơn và dễ quay lại hơn. Là người mới bắt đầu, việc tuân theo các quy tắc của PEP 8 có thể khiến việc học Python trở thành một công việc dễ chịu hơn nhiều.

Việc tuân theo PEP 8 là đặc biệt quan trọng nếu bạn đang tìm kiếm một công việc phát triển. Viết mã rõ ràng, dễ đọc thể hiện tính chuyên nghiệp. Nó sẽ cho nhà tuyển dụng biết rằng bạn hiểu rõ cách cấu trúc mã của mình.

Nếu bạn có thêm kinh nghiệm viết mã Python, thì bạn có thể cần cộng tác với những người khác. Viết mã có thể đọc được ở đây là rất quan trọng. Những người khác, những người có thể chưa bao giờ gặp bạn hoặc nhìn thấy phong cách viết mã của bạn trước đây, sẽ phải đọc và hiểu mã của bạn. Có các nguyên tắc mà bạn tuân theo và nhận ra sẽ giúp người khác đọc mã của bạn dễ dàng hơn.

Quy ước đặt tên

“Rõ ràng tốt hơn là ẩn ý”.

- Thiền của Python

Khi bạn viết mã Python, bạn phải đặt tên cho rất nhiều thứ: biến, hàm, lớp, gói, v.v. Chọn những cái tên hợp lý sẽ giúp bạn tiết kiệm thời gian và sức lực sau này. Bạn sẽ có thể tìm ra, từ tên, những gì một biến, hàm hoặc lớp nhất định đại diện. Bạn cũng sẽ tránh sử dụng các tên không phù hợp có thể dẫn đến lỗi khó gỡ lỗi.

Lưu ý : Không bao giờ sử dụng lhoặc Otên Icác chữ cái đơn lẻ vì chúng có thể bị nhầm lẫn 10tùy thuộc vào kiểu chữ:

O = 2  # This may look like you're trying to reassign 2 to zero

 

Kiểu đặt tên

Bảng dưới đây phác thảo một số kiểu đặt tên phổ biến trong mã Python và khi nào bạn nên sử dụng chúng:

Gõ phím

Quy ước đặt tên

Các ví dụ

Hàm số

Sử dụng một từ viết thường hoặc các từ. Phân tách các từ bằng dấu gạch dưới để cải thiện khả năng đọc.

function,my_function

Biến đổi

Sử dụng một chữ cái thường, từ hoặc các từ. Tách các từ bằng dấu gạch dưới để cải thiện khả năng đọc.

x, var_my_variable

Lớp

Bắt đầu mỗi từ bằng một chữ cái viết hoa. Không phân tách các từ bằng dấu gạch dưới. Phong cách này được gọi là trường hợp lạc đà.

Model,MyClass

Phương pháp

Sử dụng một từ viết thường hoặc các từ. Tách các từ bằng dấu gạch dưới để cải thiện khả năng đọc.

class_method,method

Liên tục

Sử dụng một chữ cái viết hoa, một từ hoặc các từ. Tách các từ bằng dấu gạch dưới để cải thiện khả năng đọc.

CONSTANT, MY_CONSTANT_MY_LONG_CONSTANT

Mô-đun

Sử dụng một từ ngắn, viết thường hoặc các từ. Tách các từ bằng dấu gạch dưới để cải thiện khả năng đọc.

module.py,my_module.py

Bưu kiện

Sử dụng một từ ngắn, viết thường hoặc các từ. Không phân tách các từ bằng dấu gạch dưới.

package,mypackage

Đây là một số quy ước đặt tên phổ biến và ví dụ về cách sử dụng chúng. Nhưng để viết mã có thể đọc được, bạn vẫn phải cẩn thận với việc lựa chọn các chữ cái và từ của mình. Ngoài việc chọn các kiểu đặt tên chính xác trong mã của bạn, bạn cũng phải chọn tên cẩn thận. Dưới đây là một số gợi ý về cách làm điều này một cách hiệu quả nhất có thể.

Cách chọn tên

Việc chọn tên cho các biến, hàm, lớp, v.v. của bạn có thể là một thách thức. Bạn nên cân nhắc kỹ lưỡng các lựa chọn đặt tên của mình khi viết mã vì nó sẽ làm cho mã của bạn dễ đọc hơn. Cách tốt nhất để đặt tên cho các đối tượng của bạn bằng Python là sử dụng tên mô tả để làm rõ đối tượng đại diện cho cái gì.

Khi đặt tên cho các biến, bạn có thể bị cám dỗ để chọn những tên đơn giản, viết thường một chữ cái, chẳng hạn như x. Nhưng, trừ khi bạn đang sử dụng xlàm đối số của một hàm toán học, còn không thì nó không rõ ràng xđại diện cho cái gì. Hãy tưởng tượng bạn đang lưu trữ tên của một người dưới dạng chuỗi và bạn muốn sử dụng phương pháp cắt chuỗi để định dạng tên của họ theo cách khác. Bạn có thể kết thúc với một cái gì đó như thế này:

>>>

>>> # Not recommended

>>> x = 'John Smith'

>>> y, z = x.split()

>>> print(z, y, sep=', ')

'Smith, John'

 

Điều này sẽ hiệu quả, nhưng bạn sẽ phải theo dõi những gì và xđại diện. Nó cũng có thể gây nhầm lẫn cho các cộng tác viên. Một lựa chọn rõ ràng hơn về tên sẽ là một cái gì đó như thế này:yz

>>>

>>> # Recommended

>>> name = 'John Smith'

>>> first_name, last_name = name.split()

>>> print(last_name, first_name, sep=', ')

'Smith, John'

Tương tự như vậy, để giảm bớt số lần gõ, bạn có thể sử dụng các từ viết tắt khi chọn tên. Trong ví dụ bên dưới, tôi đã định nghĩa một hàm db()nhận một đối số duy nhất xvà nhân đôi nó:

# Not recommended

def db(x):

    return x * 2

 

Thoạt nhìn, đây có vẻ là một lựa chọn hợp lý. db()có thể dễ dàng là một từ viết tắt của double. Nhưng hãy tưởng tượng quay lại mã này sau một vài ngày. Bạn có thể đã quên những gì bạn đang cố gắng đạt được với chức năng này và điều đó sẽ khiến việc đoán cách bạn viết tắt trở nên khó khăn.

Ví dụ sau đây rõ ràng hơn nhiều. Nếu bạn quay lại mã này vài ngày sau khi viết nó, bạn vẫn có thể đọc và hiểu mục đích của hàm này:

# Recommended

def multiply_by_two(x):

    return x * 2

Triết lý tương tự áp dụng cho tất cả các kiểu dữ liệu và đối tượng khác trong Python. Luôn cố gắng sử dụng những cái tên ngắn gọn nhưng mang tính mô tả nhất có thể.

Bố cục mã

Cách bạn bố trí mã của mình có vai trò rất lớn trong việc nó có thể đọc được như thế nào. Trong phần này, bạn sẽ học cách thêm khoảng trắng dọc để cải thiện khả năng đọc mã của bạn. Bạn cũng sẽ học cách xử lý giới hạn 79 dòng ký tự được đề xuất trong PEP 8.

Dòng trống

Khoảng trắng dọc, hoặc các dòng trống, có thể cải thiện đáng kể khả năng đọc mã của bạn. Mã được tập hợp lại với nhau có thể gây choáng ngợp và khó đọc. Tương tự, quá nhiều dòng trống trong mã của bạn khiến nó trông rất thưa thớt và người đọc có thể cần cuộn nhiều hơn mức cần thiết. Dưới đây là ba hướng dẫn chính về cách sử dụng khoảng trắng dọc.

Bao quanh các hàm và lớp cấp cao nhất bằng hai dòng trống. Các lớp và hàm cấp cao nhất nên khá khép kín và xử lý các chức năng riêng biệt. Sẽ rất hợp lý khi đặt thêm không gian thẳng đứng xung quanh chúng, để rõ ràng chúng tách biệt:

class MyFirstClass:

    pass

class MySecondClass:

    pass

def top_level_function():

    return None

Bao quanh các định nghĩa phương thức bên trong các lớp bằng một dòng trống duy nhất. Bên trong một lớp, tất cả các hàm đều liên quan đến nhau. Thực hành tốt là chỉ để lại một dòng duy nhất giữa chúng:

class MyClass:

    def first_method(self):

        return None




    def second_method(self):

        return None

 

Sử dụng các dòng trống một cách tiết kiệm bên trong các chức năng để hiển thị các bước rõ ràng. Đôi khi, một hàm phức tạp phải hoàn thành một số bước trước returncâu lệnh . Để giúp người đọc hiểu logic bên trong hàm, có thể hữu ích nếu để một dòng trống giữa mỗi bước.

Trong ví dụ dưới đây, có một hàm để tính phương sai của một danh sách . Đây là vấn đề gồm hai bước, vì vậy tôi đã chỉ ra từng bước bằng cách để lại một dòng trống giữa chúng. Cũng có một dòng trống trước returncâu lệnh. Điều này giúp người đọc thấy rõ những gì được trả lại:

def calculate_variance(number_list):

    sum_list = 0

    for number in number_list:

        sum_list = sum_list + number

    mean = sum_list / len(number_list)

    sum_squares = 0

    for number in number_list:

        sum_squares = sum_squares + number**2

    mean_squares = sum_squares / len(number_list)

    return mean_squares - mean**2

 

Nếu bạn sử dụng khoảng trắng dọc một cách cẩn thận, nó có thể cải thiện đáng kể khả năng đọc mã của bạn. Nó giúp người đọc hiểu một cách trực quan cách mã của bạn chia thành các phần và cách các phần đó liên quan với nhau.

Độ dài dòng tối đa và ngắt dòng

PEP 8 đề xuất các dòng nên được giới hạn ở 79 ký tự. Điều này là do nó cho phép bạn mở nhiều tệp bên cạnh nhau, đồng thời tránh bị dòng.

Tất nhiên, không phải lúc nào cũng có thể giữ các câu lệnh có độ dài 79 ký tự hoặc ít hơn. PEP 8 phác thảo các cách để cho phép các câu lệnh chạy trên một số dòng.

Python sẽ giả sử tiếp tục dòng nếu mã được chứa trong dấu ngoặc đơn, dấu ngoặc nhọn hoặc dấu ngoặc nhọn:

def function(arg_one, arg_two,

             arg_three, arg_four):

    return arg_one

 

Nếu không thể sử dụng tiếp diễn ngụ ý, bạn có thể sử dụng dấu gạch chéo ngược để ngắt dòng:

from mypkg import example1, \

    example2, example3

Tuy nhiên, nếu bạn có thể sử dụng thì tiếp diễn ngụ ý, thì bạn nên làm như vậy.

Nếu việc ngắt dòng cần xảy ra xung quanh toán tử nhị phân, chẳng hạn như +*, nó phải xảy ra trước toán tử. Quy tắc này bắt nguồn từ toán học. Các nhà toán học đồng ý rằng việc phá vỡ trước các toán tử nhị phân cải thiện khả năng đọc. So sánh hai ví dụ sau.

Dưới đây là một ví dụ về việc ngắt trước một toán tử nhị phân:

# Recommended

total = (first_variable

         + second_variable

         - third_variable)

Bạn có thể thấy ngay biến nào đang được thêm vào hoặc bị trừ đi, vì toán tử nằm ngay bên cạnh biến đang được thao tác.

Bây giờ, chúng ta hãy xem một ví dụ về việc ngắt sau một toán tử nhị phân:

# Not Recommended

total = (first_variable +

         second_variable -

         third_variable)

Ở đây, khó hơn để xem biến nào đang được thêm vào và biến nào bị trừ đi.

Việc phá vỡ trước khi các toán tử nhị phân tạo ra mã dễ đọc hơn, vì vậy PEP 8 khuyến khích việc này. Mã luôn ngắt sau toán tử nhị phân vẫn tuân thủ PEP 8. Tuy nhiên, bạn nên phá vỡ trước một toán tử nhị phân.

>>> Tham khảo: Khóa học lập trình Python T3H