Hướng dẫn how to write good python code - làm thế nào để viết mã python tốt

Hướng dẫn how to write good python code - làm thế nào để viết mã python tốt

Nếu bạn hỏi các lập trình viên Python những gì họ thích nhất về Python, họ sẽ thường trích dẫn khả năng đọc cao của nó. Thật vậy, một mức độ dễ đọc cao là trung tâm của thiết kế ngôn ngữ Python, theo thực tế được công nhận rằng mã được đọc thường xuyên hơn nhiều so với viết.

Một lý do cho khả năng đọc cao của mã Python là bộ hướng dẫn kiểu mã tương đối đầy đủ của nó và các thành ngữ pythonic pythonic.

Khi một nhà phát triển Python kỳ cựu (A Pythonista) gọi các phần của mã không phải là Pythonic, họ thường có nghĩa là các dòng mã này không tuân theo các hướng dẫn chung và không thể hiện ý định của nó trong những gì được coi là tốt nhất (nghe: có thể đọc được nhất) đường.

Trên một số trường hợp biên giới, không có cách nào tốt nhất đã được thỏa thuận về cách thể hiện ý định trong mã Python, nhưng những trường hợp này là rất hiếm.

Khái niệm chung¶

Mã rõ ràng

Mặc dù bất kỳ loại ma thuật đen nào cũng có thể với Python, nhưng cách rõ ràng và đơn giản nhất đều được ưa thích.

Xấu

def make_complex(*args):
    x, y = args
    return dict(**locals())

Tốt

def make_complex(x, y):
    return {'x': x, 'y': y}

Trong mã tốt ở trên, X và Y được nhận rõ ràng từ người gọi và một từ điển rõ ràng được trả về. Nhà phát triển sử dụng chức năng này biết chính xác phải làm gì bằng cách đọc các dòng đầu tiên và cuối cùng, đó không phải là trường hợp với ví dụ xấu.

Một tuyên bố trên mỗi dòng

Mặc dù một số tuyên bố hỗn hợp như toàn bộ danh sách được cho phép và đánh giá cao về sự ngắn gọn và tính biểu cảm của chúng, nhưng thật tệ khi có hai câu lệnh rời rạc trên cùng một dòng mã.

Xấu

print('one'); print('two')

if x == 1: print('one')

if <complex comparison> and <other complex comparison>:
    # do something

Tốt

print('one')
print('two')

if x == 1:
    print('one')

cond1 = <complex comparison>
cond2 = <other complex comparison>
if cond1 and cond2:
    # do something

Trong mã tốt ở trên, X và Y được nhận rõ ràng từ người gọi và một từ điển rõ ràng được trả về. Nhà phát triển sử dụng chức năng này biết chính xác phải làm gì bằng cách đọc các dòng đầu tiên và cuối cùng, đó không phải là trường hợp với ví dụ xấu.

Một tuyên bố trên mỗi dòng

  1. Mặc dù một số tuyên bố hỗn hợp như toàn bộ danh sách được cho phép và đánh giá cao về sự ngắn gọn và tính biểu cảm của chúng, nhưng thật tệ khi có hai câu lệnh rời rạc trên cùng một dòng mã. are mandatory and have no default values. They are the simplest form of arguments and they can be used for the few function arguments that are fully part of the function’s meaning and their order is natural. For instance, in
    print('one')
    print('two')
    
    if x == 1:
        print('one')
    
    cond1 = <complex comparison>
    cond2 = <other complex comparison>
    if cond1 and cond2:
        # do something
    
    6 or
    print('one')
    print('two')
    
    if x == 1:
        print('one')
    
    cond1 = <complex comparison>
    cond2 = <other complex comparison>
    if cond1 and cond2:
        # do something
    
    7 the user of the function has no difficulty remembering that those two functions require two arguments, and in which order.

Các đối số chức năng

  1. Đối số có thể được chuyển đến các chức năng theo bốn cách khác nhau. are not mandatory and have default values. They are often used for optional parameters sent to the function. When a function has more than two or three positional parameters, its signature is more difficult to remember and using keyword arguments with default values is helpful. For instance, a more complete
    def complex_function(a, b, c):
        if not a:
            return None  # Raising an exception might be better
        if not b:
            return None  # Raising an exception might be better
        # Some complex code trying to compute x from a, b and c
        # Resist temptation to return x if succeeded
        if not x:
            # Some Plan-B computation of x
        return x  # One single exit point for the returned value x will help
                  # when maintaining the code.
    
    2 function could be defined as
    def complex_function(a, b, c):
        if not a:
            return None  # Raising an exception might be better
        if not b:
            return None  # Raising an exception might be better
        # Some complex code trying to compute x from a, b and c
        # Resist temptation to return x if succeeded
        if not x:
            # Some Plan-B computation of x
        return x  # One single exit point for the returned value x will help
                  # when maintaining the code.
    
    3. Here
    def complex_function(a, b, c):
        if not a:
            return None  # Raising an exception might be better
        if not b:
            return None  # Raising an exception might be better
        # Some complex code trying to compute x from a, b and c
        # Resist temptation to return x if succeeded
        if not x:
            # Some Plan-B computation of x
        return x  # One single exit point for the returned value x will help
                  # when maintaining the code.
    
    4 and
    def complex_function(a, b, c):
        if not a:
            return None  # Raising an exception might be better
        if not b:
            return None  # Raising an exception might be better
        # Some complex code trying to compute x from a, b and c
        # Resist temptation to return x if succeeded
        if not x:
            # Some Plan-B computation of x
        return x  # One single exit point for the returned value x will help
                  # when maintaining the code.
    
    5 are optional, and evaluate to
    def complex_function(a, b, c):
        if not a:
            return None  # Raising an exception might be better
        if not b:
            return None  # Raising an exception might be better
        # Some complex code trying to compute x from a, b and c
        # Resist temptation to return x if succeeded
        if not x:
            # Some Plan-B computation of x
        return x  # One single exit point for the returned value x will help
                  # when maintaining the code.
    
    6 when they are not passed another value.

Đối số vị trí là bắt buộc và không có giá trị mặc định. Chúng là hình thức đơn giản nhất của các đối số và chúng có thể được sử dụng cho một vài đối số chức năng hoàn toàn là một phần của hàm ý nghĩa của hàm và thứ tự của chúng là tự nhiên. Chẳng hạn, trong

print('one')
print('two')

if x == 1:
    print('one')

cond1 = <complex comparison>
cond2 = <other complex comparison>
if cond1 and cond2:
    # do something
6 hoặc
print('one')
print('two')

if x == 1:
    print('one')

cond1 = <complex comparison>
cond2 = <other complex comparison>
if cond1 and cond2:
    # do something
7 Người dùng chức năng không gặp khó khăn gì khi nhớ rằng hai chức năng đó yêu cầu hai đối số và theo thứ tự nào.

Trong hai trường hợp đó, có thể sử dụng tên đối số khi gọi các hàm và, làm như vậy, có thể chuyển đổi thứ tự đối số, gọi ví dụ Các cuộc gọi đơn giản đến

def complex_function(a, b, c):
    if not a:
        return None  # Raising an exception might be better
    if not b:
        return None  # Raising an exception might be better
    # Some complex code trying to compute x from a, b and c
    # Resist temptation to return x if succeeded
    if not x:
        # Some Plan-B computation of x
    return x  # One single exit point for the returned value x will help
              # when maintaining the code.
0 và
def complex_function(a, b, c):
    if not a:
        return None  # Raising an exception might be better
    if not b:
        return None  # Raising an exception might be better
    # Some complex code trying to compute x from a, b and c
    # Resist temptation to return x if succeeded
    if not x:
        # Some Plan-B computation of x
    return x  # One single exit point for the returned value x will help
              # when maintaining the code.
1.

  1. Đối số từ khóa không bắt buộc và có giá trị mặc định. Chúng thường được sử dụng cho các tham số tùy chọn được gửi đến hàm. Khi một hàm có nhiều hơn hai hoặc ba tham số vị trí, chữ ký của nó khó nhớ hơn và sử dụng các đối số từ khóa với các giá trị mặc định là hữu ích. Chẳng hạn, hàm
    def complex_function(a, b, c):
        if not a:
            return None  # Raising an exception might be better
        if not b:
            return None  # Raising an exception might be better
        # Some complex code trying to compute x from a, b and c
        # Resist temptation to return x if succeeded
        if not x:
            # Some Plan-B computation of x
        return x  # One single exit point for the returned value x will help
                  # when maintaining the code.
    
    2 đầy đủ hơn có thể được định nghĩa là
    def complex_function(a, b, c):
        if not a:
            return None  # Raising an exception might be better
        if not b:
            return None  # Raising an exception might be better
        # Some complex code trying to compute x from a, b and c
        # Resist temptation to return x if succeeded
        if not x:
            # Some Plan-B computation of x
        return x  # One single exit point for the returned value x will help
                  # when maintaining the code.
    
    3. Ở đây
    def complex_function(a, b, c):
        if not a:
            return None  # Raising an exception might be better
        if not b:
            return None  # Raising an exception might be better
        # Some complex code trying to compute x from a, b and c
        # Resist temptation to return x if succeeded
        if not x:
            # Some Plan-B computation of x
        return x  # One single exit point for the returned value x will help
                  # when maintaining the code.
    
    4 và
    def complex_function(a, b, c):
        if not a:
            return None  # Raising an exception might be better
        if not b:
            return None  # Raising an exception might be better
        # Some complex code trying to compute x from a, b and c
        # Resist temptation to return x if succeeded
        if not x:
            # Some Plan-B computation of x
        return x  # One single exit point for the returned value x will help
                  # when maintaining the code.
    
    5 là tùy chọn và đánh giá thành
    def complex_function(a, b, c):
        if not a:
            return None  # Raising an exception might be better
        if not b:
            return None  # Raising an exception might be better
        # Some complex code trying to compute x from a, b and c
        # Resist temptation to return x if succeeded
        if not x:
            # Some Plan-B computation of x
        return x  # One single exit point for the returned value x will help
                  # when maintaining the code.
    
    6 khi chúng không được thông qua một giá trị khác.arbitrary argument list is the third way to pass arguments to a function. If the function intention is better expressed by a signature with an extensible number of positional arguments, it can be defined with the
    for index, item in enumerate(some_list):
        # do something with index and item
    
    0 constructs. In the function body,
    for index, item in enumerate(some_list):
        # do something with index and item
    
    1 will be a tuple of all the remaining positional arguments. For example,
    for index, item in enumerate(some_list):
        # do something with index and item
    
    2 can be called with each recipient as an argument:
    for index, item in enumerate(some_list):
        # do something with index and item
    
    3, and in the function body
    for index, item in enumerate(some_list):
        # do something with index and item
    
    1 will be equal to
    for index, item in enumerate(some_list):
        # do something with index and item
    
    5.

Gọi một chức năng với các đối số từ khóa có thể được thực hiện theo nhiều cách trong Python; Ví dụ, có thể tuân theo thứ tự các lập luận trong định nghĩa mà không đặt tên rõ ràng các lập luận, như trong

def complex_function(a, b, c):
    if not a:
        return None  # Raising an exception might be better
    if not b:
        return None  # Raising an exception might be better
    # Some complex code trying to compute x from a, b and c
    # Resist temptation to return x if succeeded
    if not x:
        # Some Plan-B computation of x
    return x  # One single exit point for the returned value x will help
              # when maintaining the code.
7, gửi một bản sao carbon mù cho Chúa. Cũng có thể đặt tên cho các đối số theo thứ tự khác, như trong
def complex_function(a, b, c):
    if not a:
        return None  # Raising an exception might be better
    if not b:
        return None  # Raising an exception might be better
    # Some complex code trying to compute x from a, b and c
    # Resist temptation to return x if succeeded
    if not x:
        # Some Plan-B computation of x
    return x  # One single exit point for the returned value x will help
              # when maintaining the code.
8. Hai khả năng đó được tránh tốt hơn mà không có bất kỳ lý do mạnh mẽ nào để không tuân theo cú pháp gần nhất với định nghĩa hàm:
def complex_function(a, b, c):
    if not a:
        return None  # Raising an exception might be better
    if not b:
        return None  # Raising an exception might be better
    # Some complex code trying to compute x from a, b and c
    # Resist temptation to return x if succeeded
    if not x:
        # Some Plan-B computation of x
    return x  # One single exit point for the returned value x will help
              # when maintaining the code.
9.

  1. Từ điển đối số từ khóa tùy ý là cách cuối cùng để chuyển các đối số cho các chức năng. Nếu hàm yêu cầu một loạt các đối số được đặt tên không xác định, có thể sử dụng cấu trúc
    for index, item in enumerate(some_list):
        # do something with index and item
    
    9. Trong cơ thể chức năng,
    a, *rest = [1, 2, 3]
    # a = 1, rest = [2, 3]
    a, *middle, c = [1, 2, 3, 4]
    # a = 1, middle = [2, 3], c = 4
    
    0 sẽ là một từ điển của tất cả các đối số được đặt tên được thông qua chưa bị bắt bởi các đối số từ khóa khác trong chữ ký hàm.arbitrary keyword argument dictionary is the last way to pass arguments to functions. If the function requires an undetermined series of named arguments, it is possible to use the
    for index, item in enumerate(some_list):
        # do something with index and item
    
    9 construct. In the function body,
    a, *rest = [1, 2, 3]
    # a = 1, rest = [2, 3]
    a, *middle, c = [1, 2, 3, 4]
    # a = 1, middle = [2, 3], c = 4
    
    0 will be a dictionary of all the passed named arguments that have not been caught by other keyword arguments in the function signature.

Sự thận trọng tương tự như trong trường hợp danh sách đối số tùy ý là cần thiết, vì những lý do tương tự: các kỹ thuật mạnh mẽ này sẽ được sử dụng khi có sự cần thiết đã được chứng minh để sử dụng chúng và chúng không nên được sử dụng nếu cấu trúc đơn giản và rõ ràng hơn là đủ thể hiện ý định của chức năng.

Tùy thuộc vào lập trình viên viết hàm để xác định đối số nào là đối số vị trí và đó là đối số từ khóa tùy chọn và để quyết định có nên sử dụng các kỹ thuật nâng cao của đối số tùy ý. Nếu lời khuyên trên được tuân thủ một cách khôn ngoan, có thể và thú vị khi viết các chức năng Python đó là:

  • Dễ dàng đọc (tên và đối số không cần giải thích)
  • Dễ dàng thay đổi (thêm một đối số từ khóa mới không phá vỡ các phần khác của mã)

Tránh cây đũa phép ma thuật

Một công cụ mạnh mẽ cho tin tặc, Python đi kèm với một bộ móc và công cụ rất phong phú cho phép bạn thực hiện hầu hết mọi thủ thuật khó khăn. Chẳng hạn, có thể thực hiện từng điều sau đây:

  • thay đổi cách tạo và khởi tạo đối tượng
  • Thay đổi cách các phiên dịch viên Python nhập các mô -đun
  • Thậm chí có thể (và được khuyến nghị nếu cần) để nhúng các thói quen C trong Python.

Tuy nhiên, tất cả các tùy chọn này đều có nhiều nhược điểm và tốt hơn là sử dụng cách đơn giản nhất để đạt được mục tiêu của bạn. Hạn chế chính là khả năng đọc phải chịu rất nhiều khi sử dụng các cấu trúc này. Nhiều công cụ phân tích mã, chẳng hạn như pylint hoặc pyflakes, sẽ không thể phân tích mã ma thuật này.

Chúng tôi xem xét rằng một nhà phát triển Python nên biết về những khả năng gần như vô hạn này, bởi vì nó thấm nhuần sự tự tin rằng không có vấn đề nào sẽ không thể xảy ra. Tuy nhiên, biết làm thế nào và đặc biệt khi không sử dụng chúng là rất quan trọng.not to use them is very important.

Giống như một bậc thầy kung fu, một Pythonista biết cách giết bằng một ngón tay duy nhất, và không bao giờ thực sự làm điều đó.

Tất cả chúng ta đều là người dùng có trách nhiệm

Như đã thấy ở trên, Python cho phép nhiều thủ thuật, và một số trong số chúng có khả năng nguy hiểm. Một ví dụ điển hình là bất kỳ mã máy khách nào cũng có thể ghi đè một thuộc tính và phương thức của đối tượng: không có từ khóa riêng tư của bạn trong Python. Triết lý này, rất khác với các ngôn ngữ phòng thủ cao như Java, nơi cung cấp rất nhiều cơ chế để ngăn chặn bất kỳ sự lạm dụng nào, được thể hiện bằng câu nói: Tất cả chúng ta đều là người dùng có trách nhiệm.

Điều này không có nghĩa là, ví dụ, không có thuộc tính nào được coi là riêng tư và không thể đóng gói thích hợp ở Python. Thay vào đó, thay vì dựa vào các bức tường bê tông được xây dựng bởi các nhà phát triển giữa mã của họ và các nhà khác, cộng đồng Python thích dựa vào một tập hợp các quy ước cho thấy các yếu tố này không nên được truy cập trực tiếp.

Công ước chính cho các tài sản tư nhân và chi tiết triển khai là tiền tố tất cả các bên trong của các bên trong với một dấu gạch dưới. Nếu mã máy khách phá vỡ quy tắc này và truy cập các yếu tố được đánh dấu này, bất kỳ hành vi sai trái hoặc vấn đề nào gặp phải nếu mã được sửa đổi là trách nhiệm của mã máy khách.

Sử dụng quy ước này một cách hào phóng được khuyến khích: bất kỳ phương thức hoặc thuộc tính nào không được sử dụng bởi mã máy khách nên được đặt trước với một dấu gạch dưới. Điều này sẽ đảm bảo phân tách tốt hơn các nhiệm vụ và sửa đổi mã hiện tại dễ dàng hơn; Sẽ luôn có thể công khai một tài sản riêng, nhưng làm cho một tài sản công cộng có thể là một hoạt động khó khăn hơn nhiều.

Trả về các giá trị

Khi một hàm phát triển trong độ phức tạp, không có gì lạ khi sử dụng nhiều câu lệnh trả về bên trong cơ thể chức năng. Tuy nhiên, để giữ một ý định rõ ràng và mức độ dễ đọc bền vững, tốt nhất là tránh trả về các giá trị có ý nghĩa từ nhiều điểm đầu ra trong cơ thể.

Có hai trường hợp chính để trả về các giá trị trong một hàm: kết quả của chức năng trả về khi nó được xử lý bình thường và các trường hợp lỗi biểu thị tham số đầu vào sai hoặc bất kỳ lý do nào khác để hàm không thể hoàn thành tính toán của nó hoặc nhiệm vụ.

Nếu bạn không muốn tăng các ngoại lệ cho trường hợp thứ hai, thì hãy trả lại một giá trị, chẳng hạn như không có hoặc sai, cho thấy rằng chức năng không thể thực hiện chính xác có thể cần thiết. Trong trường hợp này, tốt hơn là trở lại sớm nhất là bối cảnh không chính xác đã được phát hiện. Nó sẽ giúp làm phẳng cấu trúc của hàm: tất cả mã sau câu lệnh return-do-of-of-error có thể cho rằng điều kiện được đáp ứng để tính toán thêm kết quả chính của hàm. Có nhiều tuyên bố trả lại như vậy thường là cần thiết.

Tuy nhiên, khi một hàm có nhiều điểm thoát chính cho khóa học bình thường của nó, việc gỡ lỗi kết quả trả lại trở nên khó khăn, do đó, có thể tốt hơn là giữ một điểm thoát duy nhất. Điều này cũng sẽ giúp đưa ra một số đường dẫn mã và nhiều điểm thoát là một dấu hiệu có thể xảy ra rằng việc tái cấu trúc như vậy là cần thiết.

def complex_function(a, b, c):
    if not a:
        return None  # Raising an exception might be better
    if not b:
        return None  # Raising an exception might be better
    # Some complex code trying to compute x from a, b and c
    # Resist temptation to return x if succeeded
    if not x:
        # Some Plan-B computation of x
    return x  # One single exit point for the returned value x will help
              # when maintaining the code.

Thành ngữ

Một thành ngữ lập trình, đặt đơn giản, là một cách để viết mã. Khái niệm thành ngữ lập trình được thảo luận amply tại C2 và tại Stack Overflow.

Mã Python thành ngữ thường được gọi là Pythonic.

Mặc dù thường có một - và tốt nhất là chỉ một - cách rõ ràng để làm điều đó; Cách viết mã Python thành ngữ có thể không rõ ràng với người mới bắt đầu Python. Vì vậy, các thành ngữ tốt phải được có được một cách có ý thức.

Một số thành ngữ Python phổ biến theo sau:

Giải nén Or

Nếu bạn biết độ dài của danh sách hoặc tuple, bạn có thể gán tên cho các yếu tố của nó với việc giải nén. Ví dụ, vì

a, *rest = [1, 2, 3]
# a = 1, rest = [2, 3]
a, *middle, c = [1, 2, 3, 4]
# a = 1, middle = [2, 3], c = 4
1 sẽ cung cấp một bộ ba phần tử cho mỗi mục trong danh sách:

for index, item in enumerate(some_list):
    # do something with index and item

Bạn cũng có thể sử dụng điều này để trao đổi các biến:

Nesting Unpacking hoạt động quá:

Trong Python 3, một phương pháp giải nén mở rộng mới đã được giới thiệu bởi PEP 3132:PEP 3132:

a, *rest = [1, 2, 3]
# a = 1, rest = [2, 3]
a, *middle, c = [1, 2, 3, 4]
# a = 1, middle = [2, 3], c = 4

Tạo một biến bị bỏ qua

Nếu bạn cần gán một cái gì đó (ví dụ, trong việc giải nén) nhưng sẽ không cần biến đó, hãy sử dụng

a, *rest = [1, 2, 3]
# a = 1, rest = [2, 3]
a, *middle, c = [1, 2, 3, 4]
# a = 1, middle = [2, 3], c = 4
2:Unpacking) but will not need that variable, use
a, *rest = [1, 2, 3]
# a = 1, rest = [2, 3]
a, *middle, c = [1, 2, 3, 4]
# a = 1, middle = [2, 3], c = 4
2:

filename = 'foobar.txt'
basename, __, ext = filename.rpartition('.')

Ghi chú

Nhiều hướng dẫn theo phong cách Python khuyến nghị sử dụng một bản nhấn mạnh duy nhất ____ ____63, cho các biến vứt bỏ thay vì các bản nhấn mạnh đôi được đề xuất tại đây. Vấn đề là, ____ ____63, thường được sử dụng làm bí danh cho hàm

a, *rest = [1, 2, 3]
# a = 1, rest = [2, 3]
a, *middle, c = [1, 2, 3, 4]
# a = 1, middle = [2, 3], c = 4
6 và cũng được sử dụng tại dấu nhắc tương tác để giữ giá trị của hoạt động cuối cùng. Sử dụng một dấu gạch dưới kép thay vào đó cũng rõ ràng và gần như thuận tiện, và loại bỏ nguy cơ vô tình can thiệp vào một trong những trường hợp sử dụng khác này.

Tạo một danh sách độ dài-N của cùng một điều

Sử dụng Nhà điều hành danh sách Python

a, *rest = [1, 2, 3]
# a = 1, rest = [2, 3]
a, *middle, c = [1, 2, 3, 4]
# a = 1, middle = [2, 3], c = 4
7:

Tạo danh sách Danh sách độ dài-N

Bởi vì các danh sách có thể thay đổi, toán tử

a, *rest = [1, 2, 3]
# a = 1, rest = [2, 3]
a, *middle, c = [1, 2, 3, 4]
# a = 1, middle = [2, 3], c = 4
7 (như trên) sẽ tạo một danh sách N tham chiếu đến cùng một danh sách, điều này không có khả năng những gì bạn muốn. Thay vào đó, hãy sử dụng danh sách hiểu biết:

four_lists = [[] for __ in range(4)]

Tạo một chuỗi từ Danh sách

Một thành ngữ phổ biến để tạo chuỗi là sử dụng

a, *rest = [1, 2, 3]
# a = 1, rest = [2, 3]
a, *middle, c = [1, 2, 3, 4]
# a = 1, middle = [2, 3], c = 4
9 trên một chuỗi trống.

letters = ['s', 'p', 'a', 'm']
word = ''.join(letters)

Điều này sẽ đặt giá trị của từ biến thành ‘spam. Thành ngữ này có thể được áp dụng cho danh sách và bộ dữ liệu.

Tìm kiếm một mặt hàng trong bộ sưu tập Ex

Đôi khi chúng ta cần tìm kiếm thông qua một bộ sưu tập mọi thứ. Hãy cùng xem xét hai tùy chọn: danh sách và bộ.

Lấy mã sau đây: ví dụ:

def make_complex(x, y):
    return {'x': x, 'y': y}
0

Mặc dù cả hai chức năng đều trông giống hệt nhau, bởi vì Lookup_set đang sử dụng thực tế là các bộ trong Python là các hashtables, hiệu suất tra cứu giữa hai là rất khác nhau. Để xác định xem một mục có nằm trong danh sách hay không, Python sẽ phải đi qua từng mục cho đến khi tìm thấy một mục phù hợp. Đây là thời gian tốn thời gian, đặc biệt là cho các danh sách dài. Trong một bộ, mặt khác, băm của vật phẩm sẽ cho Python biết trong bộ trong bộ để tìm kiếm một mục phù hợp. Do đó, tìm kiếm có thể được thực hiện nhanh chóng, ngay cả khi tập hợp lớn. Tìm kiếm trong từ điển hoạt động theo cùng một cách. Để biết thêm thông tin, hãy xem trang StackoverFlow này. Để biết thông tin chi tiết về lượng thời gian các hoạt động phổ biến khác nhau trên từng cấu trúc dữ liệu này, hãy xem trang này.

Do những khác biệt về hiệu suất, thường sử dụng các bộ hoặc từ điển thay vì danh sách trong trường hợp:

  • Bộ sưu tập sẽ chứa một số lượng lớn các mặt hàng
  • Bạn sẽ liên tục tìm kiếm các mục trong bộ sưu tập
  • Bạn không có các mục trùng lặp.

Đối với các bộ sưu tập nhỏ hoặc bộ sưu tập mà bạn sẽ không thường xuyên tìm kiếm, thời gian và bộ nhớ bổ sung cần thiết để thiết lập Hashtable thường sẽ lớn hơn thời gian được lưu bởi tốc độ tìm kiếm được cải thiện.

Zen of Python¶

Còn được gọi là PEP 20, các nguyên tắc hướng dẫn cho thiết kế Python.PEP 20, the guiding principles for Python’s design.

def make_complex(x, y):
    return {'x': x, 'y': y}
1

Để biết một số ví dụ về phong cách Python tốt, hãy xem các slide này từ một nhóm người dùng Python.

Pep 8¶

PEP 8 là Hướng dẫn kiểu mã thực tế cho Python. Một phiên bản chất lượng cao, dễ đọc của PEP 8 cũng có sẵn tại PEP8.org. is the de facto code style guide for Python. A high quality, easy-to-read version of PEP 8 is also available at pep8.org.

Điều này rất khuyến khích đọc. Toàn bộ cộng đồng Python làm hết sức mình để tuân thủ các hướng dẫn được đưa ra trong tài liệu này. Một số dự án có thể chuyển từ nó theo thời gian, trong khi những dự án khác có thể sửa đổi các khuyến nghị của nó.

Điều đó đang được nói, phù hợp với mã Python của bạn với PEP 8 nói chung là một ý tưởng tốt và giúp làm cho mã nhất quán hơn khi làm việc trên các dự án với các nhà phát triển khác. Có một chương trình dòng lệnh, pycodestyle (trước đây được gọi là

filename = 'foobar.txt'
basename, __, ext = filename.rpartition('.')
0), có thể kiểm tra mã của bạn để phù hợp. Cài đặt nó bằng cách chạy lệnh sau trong thiết bị đầu cuối của bạn:

def make_complex(x, y):
    return {'x': x, 'y': y}
2

Sau đó chạy nó trên một tệp hoặc loạt tệp để nhận báo cáo về bất kỳ vi phạm nào.

def make_complex(x, y):
    return {'x': x, 'y': y}
3

Tự động định dạng

Có một số công cụ tự động định dạng có thể định dạng lại mã của bạn, để tuân thủ PEP 8.

autopep8

Chương trình Autopep8 có thể được sử dụng để tự động định dạng lại mã theo kiểu PEP 8. Cài đặt chương trình với:

Sử dụng nó để định dạng một tệp tại chỗ với:

def make_complex(x, y):
    return {'x': x, 'y': y}
4

Không bao gồm cờ

filename = 'foobar.txt'
basename, __, ext = filename.rpartition('.')
1 sẽ khiến chương trình xuất trực tiếp mã sửa đổi vào bảng điều khiển để xem xét. Cờ
filename = 'foobar.txt'
basename, __, ext = filename.rpartition('.')
2 sẽ thực hiện các thay đổi đáng kể hơn và có thể được áp dụng nhiều lần để có hiệu lực lớn hơn.

yapf

Mặc dù Autopep8 tập trung vào việc giải quyết các vi phạm PEP 8, YAPF cố gắng cải thiện định dạng mã của bạn ngoài việc tuân thủ PEP 8. Điều này nhằm mục đích cung cấp mã đẹp như một lập trình viên viết mã tuân thủ PEP 8. Nó được cài đặt với:

Chạy tự động định dạng tệp với:

def make_complex(x, y):
    return {'x': x, 'y': y}
5

Tương tự như Autopep8, chạy lệnh mà không có cờ

filename = 'foobar.txt'
basename, __, ext = filename.rpartition('.')
1 sẽ xuất ra Diff để xem xét trước khi áp dụng các thay đổi.

màu đen

Màu đen tự động tạo ra một định dạng lại có quan điểm và xác định của cơ sở mã của bạn. Trọng tâm chính của nó nằm ở việc cung cấp một kiểu mã thống nhất mà không cần cấu hình trong suốt người dùng. Do đó, người dùng màu đen có thể quên đi việc định dạng hoàn toàn. Ngoài ra, do phương pháp xác định các khác nhau tối thiểu chỉ với những thay đổi liên quan được đảm bảo. Bạn có thể cài đặt công cụ như sau:

Một tệp Python có thể được định dạng với:

Thêm cờ

filename = 'foobar.txt'
basename, __, ext = filename.rpartition('.')
4 cung cấp sửa đổi mã để xem xét mà không cần ứng dụng trực tiếp.

Hội nghị công

Dưới đây là một số quy ước bạn nên làm theo để làm cho mã của bạn dễ đọc hơn.

Kiểm tra xem một biến có bằng không đổi không

Bạn không cần phải so sánh rõ ràng một giá trị với True, hoặc không có, hoặc 0 - bạn chỉ có thể thêm nó vào câu lệnh IF. Xem thử nghiệm giá trị sự thật để biết danh sách những gì được coi là sai.

Bad::

def make_complex(x, y):
    return {'x': x, 'y': y}
6

Good::

def make_complex(x, y):
    return {'x': x, 'y': y}
7

Truy cập một phần tử từ điển

Don Tiết sử dụng phương pháp

filename = 'foobar.txt'
basename, __, ext = filename.rpartition('.')
5. Thay vào đó, hãy sử dụng cú pháp
filename = 'foobar.txt'
basename, __, ext = filename.rpartition('.')
6 hoặc chuyển đối số mặc định cho
filename = 'foobar.txt'
basename, __, ext = filename.rpartition('.')
7.

Bad::

def make_complex(x, y):
    return {'x': x, 'y': y}
8

Good::

def make_complex(x, y):
    return {'x': x, 'y': y}
9

Những cách ngắn để thao túng danh sách

Danh sách toàn diện cung cấp một cách mạnh mẽ, súc tích để làm việc với danh sách.

Biểu thức của Generator tuân theo gần như cùng một cú pháp như toàn bộ danh sách nhưng trả về một trình tạo thay vì một danh sách.

Tạo một danh sách mới đòi hỏi nhiều công việc hơn và sử dụng nhiều bộ nhớ hơn. Nếu bạn chỉ cần lặp qua danh sách mới, thay vào đó, hãy sử dụng một trình lặp.

Bad::

print('one'); print('two')

if x == 1: print('one')

if <complex comparison> and <other complex comparison>:
    # do something
0

Good::

print('one'); print('two')

if x == 1: print('one')

if <complex comparison> and <other complex comparison>:
    # do something
1

Sử dụng toàn bộ danh sách khi bạn thực sự cần tạo danh sách thứ hai, ví dụ nếu bạn cần sử dụng kết quả nhiều lần.

Nếu logic của bạn quá phức tạp đối với một danh sách ngắn hiểu hoặc biểu thức máy phát, hãy xem xét sử dụng chức năng trình tạo thay vì trả về danh sách.

Good::

print('one'); print('two')

if x == 1: print('one')

if <complex comparison> and <other complex comparison>:
    # do something
2

Không bao giờ sử dụng danh sách hiểu chỉ cho các tác dụng phụ của nó.

Bad::

print('one'); print('two')

if x == 1: print('one')

if <complex comparison> and <other complex comparison>:
    # do something
3

Good::

print('one'); print('two')

if x == 1: print('one')

if <complex comparison> and <other complex comparison>:
    # do something
4

Lọc danh sách

Bad::

Không bao giờ xóa các mục khỏi danh sách trong khi bạn đang lặp đi lặp lại thông qua nó.

print('one'); print('two')

if x == 1: print('one')

if <complex comparison> and <other complex comparison>:
    # do something
5

Donith thực hiện nhiều đường chuyền qua danh sách.

print('one'); print('two')

if x == 1: print('one')

if <complex comparison> and <other complex comparison>:
    # do something
6

Good::

Sử dụng danh sách hiểu hoặc biểu thức máy phát.

print('one'); print('two')

if x == 1: print('one')

if <complex comparison> and <other complex comparison>:
    # do something
7

Có thể có tác dụng phụ của việc sửa đổi danh sách ban đầu

Sửa đổi danh sách ban đầu có thể gặp rủi ro nếu có các biến khác tham chiếu nó. Nhưng bạn có thể sử dụng gán lát cắt nếu bạn thực sự muốn làm điều đó.

print('one'); print('two')

if x == 1: print('one')

if <complex comparison> and <other complex comparison>:
    # do something
8

Sửa đổi các giá trị trong danh sách

Bad::

Hãy nhớ rằng bài tập không bao giờ tạo ra một đối tượng mới. Nếu hai hoặc nhiều biến đề cập đến cùng một danh sách, thay đổi một trong số chúng thay đổi tất cả.

print('one'); print('two')

if x == 1: print('one')

if <complex comparison> and <other complex comparison>:
    # do something
9

Good::

Nó an toàn hơn để tạo ra một đối tượng danh sách mới và để bản gốc một mình.

print('one')
print('two')

if x == 1:
    print('one')

cond1 = <complex comparison>
cond2 = <other complex comparison>
if cond1 and cond2:
    # do something
0

Sử dụng

a, *rest = [1, 2, 3]
# a = 1, rest = [2, 3]
a, *middle, c = [1, 2, 3, 4]
# a = 1, middle = [2, 3], c = 4
1 Giữ số lượng vị trí của bạn trong danh sách.

print('one')
print('two')

if x == 1:
    print('one')

cond1 = <complex comparison>
cond2 = <other complex comparison>
if cond1 and cond2:
    # do something
1

Hàm

a, *rest = [1, 2, 3]
# a = 1, rest = [2, 3]
a, *middle, c = [1, 2, 3, 4]
# a = 1, middle = [2, 3], c = 4
1 có khả năng đọc tốt hơn so với xử lý một bộ đếm bằng tay. Hơn nữa, nó được tối ưu hóa tốt hơn cho các trình lặp.

Đọc từ một tập tin

Sử dụng cú pháp

four_lists = [[] for __ in range(4)]
0 để đọc từ các tệp. Điều này sẽ tự động đóng các tệp cho bạn.

Bad::

print('one')
print('two')

if x == 1:
    print('one')

cond1 = <complex comparison>
cond2 = <other complex comparison>
if cond1 and cond2:
    # do something
2

Good::

print('one')
print('two')

if x == 1:
    print('one')

cond1 = <complex comparison>
cond2 = <other complex comparison>
if cond1 and cond2:
    # do something
3

Câu lệnh

four_lists = [[] for __ in range(4)]
1 tốt hơn vì nó sẽ đảm bảo bạn luôn đóng tệp, ngay cả khi một ngoại lệ được nêu trong khối
four_lists = [[] for __ in range(4)]
1.

Tiếp tục dòng

Khi một dòng mã logic dài hơn giới hạn được chấp nhận, bạn cần chia nó trên nhiều dòng vật lý. Trình thông dịch Python sẽ tham gia các dòng liên tiếp nếu nhân vật cuối cùng của dòng là một dấu gạch chéo ngược. Điều này rất hữu ích trong một số trường hợp, nhưng thường nên tránh vì sự mong manh của nó: một không gian trắng được thêm vào cuối dòng, sau dấu gạch chéo ngược, sẽ phá vỡ mã và có thể có kết quả không mong muốn.

Một giải pháp tốt hơn là sử dụng dấu ngoặc đơn xung quanh các yếu tố của bạn. Còn lại với một dấu ngoặc đơn không được giải thích trên một kết thúc, thông dịch viên Python sẽ tham gia dòng tiếp theo cho đến khi dấu ngoặc đơn được đóng lại. Hành vi tương tự giữ cho niềng răng xoăn và vuông.

Bad::

print('one')
print('two')

if x == 1:
    print('one')

cond1 = <complex comparison>
cond2 = <other complex comparison>
if cond1 and cond2:
    # do something
4

Good::

print('one')
print('two')

if x == 1:
    print('one')

cond1 = <complex comparison>
cond2 = <other complex comparison>
if cond1 and cond2:
    # do something
5

Tuy nhiên, thường xuyên hơn không, phải chia một dòng logic dài là một dấu hiệu cho thấy bạn đang cố gắng làm quá nhiều việc cùng một lúc, điều này có thể cản trở khả năng đọc.

Làm thế nào để bạn viết một mã có cấu trúc tốt trong Python?

Các mẫu để viết mã sạch trong Python..
Sử dụng tên mô tả dài dễ đọc. ....
Sử dụng ý định mô tả tiết lộ tên. ....
Tránh sử dụng tốc ký mơ hồ. ....
Luôn luôn sử dụng cùng một từ vựng. ....
Không sử dụng số ma thuật. ....
Hãy phù hợp với quy ước đặt tên chức năng của bạn ..

Làm thế nào để bạn viết mã trong Python?

Cách dễ nhất để chạy Python..
Tải xuống thonny ide ..
Chạy trình cài đặt để cài đặt Thonny trên máy tính của bạn ..
Chuyển đến: Tệp> Mới.Sau đó lưu tệp với tiện ích mở rộng .py.....
Viết mã Python vào tệp và lưu nó.Chạy Python bằng Thonny IDE ..
Sau đó chuyển sang chạy> chạy tập lệnh hiện tại hoặc chỉ cần nhấp vào F5 để chạy nó ..

Một số thủ thuật python mát mẻ là gì?

Thủ thuật Python hàng đầu để lập trình hiệu quả..
Trick 1: Làm phẳng danh sách.....
Trick 2: Đảo ngược danh sách.....
Trick 3: Kết hợp các danh sách khác nhau.....
Thủ thuật 4: Danh sách lập chỉ mục tiêu cực.....
Trick 5: Phân tích thường xuyên nhất trong danh sách.....
Trick 6: đảo ngược chuỗi.....
Trick 7: Tách chuỗi.....
Trick 8: In ra nhiều giá trị của chuỗi ..