Viết mã pythonic nghĩa là gì?

Khai thác các tính năng của ngôn ngữ Python để tạo mã rõ ràng, ngắn gọn và dễ bảo trì

Pythonic có nghĩa là mã không chỉ hiểu đúng cú pháp mà còn tuân theo các quy ước của cộng đồng Python và sử dụng ngôn ngữ theo cách nó được dự định sử dụng

Điều này có thể dễ giải thích nhất bằng ví dụ tiêu cực, như trong bài viết được liên kết từ các câu trả lời khác. Các ví dụ về mã không phải Python thường đến từ những người dùng ngôn ngữ khác, những người thay vì học các mẫu lập trình Python chẳng hạn như hiểu danh sách hoặc biểu thức trình tạo, lại cố gắng sử dụng các mẫu được sử dụng phổ biến hơn trong C hoặc Java. Vòng lặp là những ví dụ đặc biệt phổ biến về điều này

Ví dụ, trong Java tôi có thể sử dụng

for(int index=0; index < items.length; index++) {
     items[index].performAction();
}

Trong Python, chúng ta có thể thử và sao chép điều này bằng cách sử dụng vòng lặp while, nhưng sẽ dễ sử dụng hơn

for item in items:
  item.perform_action()

Hoặc, thậm chí là một biểu thức trình tạo

(item.some_attribute for item in items)

Vì vậy, về cơ bản khi ai đó nói điều gì đó không phải Pythonic, họ đang nói rằng mã có thể được viết lại theo cách phù hợp hơn với phong cách viết mã của Python

for item in items:
  item.perform_action()
52 tại dòng lệnh sẽ đưa ra bản tóm tắt các nguyên tắc Python. Điều ít được biết đến hơn là mã nguồn của
for item in items:
  item.perform_action()
52 được quyết định và theo thiết kế, không phải Pythonic. Hãy xem nó để biết ví dụ về những việc không nên làm

Một câu hỏi phổ biến mà tôi đã thấy từ những người lập trình Python mới bắt đầu là, "Làm cách nào để tôi làm cho mã của mình giống Pythonic hơn?" . Nó có nghĩa là những thứ khác nhau để người khác nhau

Ý nghĩa cũng không tĩnh. Việc mã có phải là mã Pythonic hay không có thể phụ thuộc vào phiên bản Python bạn đang sử dụng và các phương pháp hay nhất để viết mã Pythonic có thể thay đổi theo thời gian

Trong bài viết này, tôi sẽ chia sẻ quan điểm của mình về điều gì tạo nên mã Pythonic bằng cách xem xét một vài ví dụ cụ thể. Tôi cũng sẽ để lại cho bạn một số tài nguyên được chọn thủ công sẽ giúp bạn xây dựng một mô hình tinh thần để quyết định khi nào mã có phải là Pythonic hay không

Nhưng trước tiên, hãy đồng ý về ít nhất một số loại định nghĩa cho từ Pythonic

"Pythonic" có nghĩa là gì?

Ngôn ngữ Python đã hơn 30 tuổi. Vào thời điểm đó, các lập trình viên Python đã cùng nhau tích lũy được một lượng kinh nghiệm khổng lồ khi sử dụng ngôn ngữ này cho nhiều mục đích khác nhau. Theo thời gian, trải nghiệm tập thể đó đã được chia sẻ và chắt lọc thành các phương pháp hay nhất — thường được gọi là cách thức của Pythonic

Zen of Python, được viết bởi Tim Peters và có thể truy cập từ bất kỳ bản cài đặt Python nào bằng cách nhập

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
9 vào REPL, theo truyền thống là minh họa cho tư duy Pythonic

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Vẻ đẹp của Zen của Python cũng là tính năng khó chịu nhất đối với người mới bắt đầu Python. Thiền nắm bắt tinh thần của Pythonic nghĩa là gì mà không đưa ra bất kỳ lời khuyên rõ ràng nào. Ví dụ, hãy xem xét nguyên tắc đầu tiên. “Đẹp hơn xấu. " OK chắc chắn. Nhưng làm cách nào để lấy mã xấu của tôi và làm cho nó đẹp?

Tuy nhiên, sự mơ hồ của Zen of Python khiến nó trở nên phù hợp như khi Tim Peters viết nó vào năm 1999. Nó phục vụ như một tập hợp các nguyên tắc hướng dẫn trang bị cho bạn ý thức phân biệt mã Pythonic với mã phi Pythonic và cung cấp nền tảng cho khuôn khổ tinh thần để đưa ra quyết định của riêng bạn

Vì vậy, điều này khiến chúng ta liên quan đến định nghĩa thực tế của từ “Pythonic” ở đâu?

[C]ode không chỉ hiểu đúng cú pháp mà còn tuân theo các quy ước của cộng đồng Python và sử dụng ngôn ngữ theo cách nó được dự định sử dụng

Có hai điểm chính ở đây

  1. Tính từ Pythonic liên quan nhiều đến phong cách hơn là cú pháp, mặc dù các thành ngữ Pythonic thường có hàm ý vượt ra ngoài các lựa chọn thuần túy về phong cách, bao gồm cả hiệu suất tốt hơn
  2. Những gì vượt qua khi Pythonic được thúc đẩy bởi cộng đồng Python

Vì vậy, bây giờ chúng ta đã có ít nhất một số hiểu biết về ý nghĩa của các lập trình viên Python khi họ gọi mã là Pythonic, hãy xem xét ba cách cụ thể để bạn có thể viết thêm mã Pythonic ngay bây giờ

Muốn nhiều hơn như thế này?

Một email vào thứ Bảy hàng tuần với một mẹo hữu ích.
Luôn mất ít hơn 5 phút thời gian của bạn.

Theo dõi ngay

Đang xử lý đơn đăng ký của bạn Tuyệt vời. Kiểm tra hộp thư đến của bạn và xác nhận đăng ký của bạn Đã xảy ra lỗi khi gửi email

Mẹo số 1. Làm quen với PEP8

PEP8 là hướng dẫn phong cách chính thức của Python. PEP là viết tắt của Đề xuất cải tiến Python. PEP là tài liệu đề xuất các tính năng mới của Python và đóng vai trò là tài liệu chính thức cho tính năng này trong khi cộng đồng Python tranh luận về việc chấp nhận hoặc từ chối tính năng đó. Làm theo PEP8 sẽ không hoàn toàn giúp mã của bạn đạt đến mức hoàn hảo của Pythonic, nhưng sẽ giúp ích rất nhiều trong việc làm cho mã của bạn trông quen thuộc với nhiều lập trình viên Python

PEP8 giải quyết những vấn đề như cách xử lý khoảng trắng trong mã của bạn, chẳng hạn như sử dụng bốn khoảng trắng để thụt đầu dòng thay vì ký tự tab hoặc độ dài dòng tối đa nên là bao nhiêu, theo PEP8, là 79 ký tự — mặc dù đây có thể là

Nếu bạn chưa quen với lập trình Python, một trong những điều đầu tiên tôi khuyên bạn nên tiếp thu từ PEP8 là các đề xuất về quy ước đặt tên. Ví dụ, bạn nên viết tên hàm và tên biến theo kiểu

# Linux/macOS
$ python3 -m pip install flake8

# Windows
$ python -m pip install flake8
0

# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600

Tên lớp nên sử dụng kiểu

# Linux/macOS
$ python3 -m pip install flake8

# Windows
$ python -m pip install flake8
1

________số 8

Viết hằng theo kiểu

# Linux/macOS
$ python3 -m pip install flake8

# Windows
$ python -m pip install flake8
2

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34

Các khuyến nghị về khoảng trắng được trình bày trong PEP8 bao gồm cách sử dụng khoảng trắng xung quanh các toán tử, xung quanh tên và đối số tham số hàm và cách ngắt các dòng dài. Mặc dù nhiều năm thực hành đọc và viết mã Python tuân thủ PEP8 sẽ giúp bạn tiếp thu những đề xuất này, nhưng vẫn còn rất nhiều điều cần nhớ

Đừng lo lắng nếu bạn không thể ghi nhớ tất cả các quy ước của PEP8. Bạn không cần phải. Các công cụ như

# Linux/macOS
$ python3 -m pip install flake8

# Windows
$ python -m pip install flake8
3 có thể giúp bạn tìm và khắc phục các sự cố PEP8 trong mã của bạn. Bạn có thể cài đặt
# Linux/macOS
$ python3 -m pip install flake8

# Windows
$ python -m pip install flake8
3 với
# Linux/macOS
$ python3 -m pip install flake8

# Windows
$ python -m pip install flake8
5

# Linux/macOS
$ python3 -m pip install flake8

# Windows
$ python -m pip install flake8

# Linux/macOS
$ python3 -m pip install flake8

# Windows
$ python -m pip install flake8
3 có thể được sử dụng làm ứng dụng dòng lệnh để quét tệp Python để tìm vi phạm kiểu. Ví dụ: giả sử tôi có một tệp văn bản tên là
# Linux/macOS
$ python3 -m pip install flake8

# Windows
$ python -m pip install flake8
7 chứa đoạn mã sau

for item in items:
  item.perform_action()
7

Chạy

# Linux/macOS
$ python3 -m pip install flake8

# Windows
$ python -m pip install flake8
3 đối với mã này cho bạn biết có những vi phạm nào và vị trí chính xác của chúng

for item in items:
  item.perform_action()
9

Mỗi dòng đầu ra từ

# Linux/macOS
$ python3 -m pip install flake8

# Windows
$ python -m pip install flake8
3 cho bạn biết vấn đề nằm ở tệp nào, vấn đề xảy ra ở dòng nào, lỗi bắt đầu từ cột nào trong dòng, số lỗi (sử dụng các mã này để định cấu hình
# Linux/macOS
$ python3 -m pip install flake8

# Windows
$ python -m pip install flake8
3 để bỏ qua các lỗi cụ thể nếu bạn muốn)

Viết mã pythonic nghĩa là gì?

Bạn thậm chí có thể thiết lập các trình chỉnh sửa như Mã VS để chèn mã của bạn bằng

# Linux/macOS
$ python3 -m pip install flake8

# Windows
$ python -m pip install flake8
3 trong khi bạn viết mã để liên tục kiểm tra mã của bạn xem có vi phạm PEP8 không. Khi
# Linux/macOS
$ python3 -m pip install flake8

# Windows
$ python -m pip install flake8
3 tìm thấy sự cố, một đường nguệch ngoạc màu đỏ sẽ xuất hiện bên dưới phần vi phạm mã của bạn và bạn có thể xem lỗi nào đã được phát hiện trong tab Sự cố của thiết bị đầu cuối tích hợp

Viết mã pythonic nghĩa là gì?
Sử dụng flake8 trong Visual Studio Code

# Linux/macOS
$ python3 -m pip install flake8

# Windows
$ python -m pip install flake8
3 là một công cụ tuyệt vời để tìm lỗi PEP8 trong mã của bạn, nhưng bạn vẫn phải sửa tất cả các lỗi đó theo cách thủ công. Đây có thể là rất nhiều công việc. May mắn thay, có một cách để tự động hóa toàn bộ quá trình

Trình định dạng tự động

for item in items:
  item.perform_action()
74 dành cho Python là một công cụ tự động định dạng mã của bạn để phù hợp với PEP8. Tất nhiên, các đề xuất của PEP8 để lại nhiều khoảng trống cho các lựa chọn phong cách và
for item in items:
  item.perform_action()
74 đưa ra nhiều quyết định cho bạn. Bạn có thể hoặc không thể đồng ý với những quyết định này.
for item in items:
  item.perform_action()
74 có thể định cấu hình ở mức tối thiểu, vì vậy bạn có thể muốn thử với nó trước khi quyết định sử dụng nó

Bạn có thể cài đặt

for item in items:
  item.perform_action()
74 với
# Linux/macOS
$ python3 -m pip install flake8

# Windows
$ python -m pip install flake8
5

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
0

Sau khi cài đặt, bạn có thể sử dụng lệnh

for item in items:
  item.perform_action()
79 trong shell của mình để xem liệu
for item in items:
  item.perform_action()
74 có thực hiện bất kỳ thay đổi nào đối với tệp không

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
3

Bạn có thể sử dụng cờ

for item in items:
  item.perform_action()
91 để xem sự khác biệt về những thay đổi mà
for item in items:
  item.perform_action()
74 sẽ thực hiện

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
6

Để tự động định dạng tệp của bạn, hãy chuyển tên tệp cho lệnh

for item in items:
  item.perform_action()
74

# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
0

Để kiểm tra xem tệp của bạn có tuân thủ PEP8 ngay bây giờ hay không, hãy chạy lại

# Linux/macOS
$ python3 -m pip install flake8

# Windows
$ python -m pip install flake8
3 với tệp đó và xem bạn có gặp lỗi nào không

# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
1

Một điều cần lưu ý khi sử dụng ________ 174 là theo mặc định, _______ 174 đặt độ dài dòng tối đa là 88 cột. Điều này khác với đề xuất của PEP8 cho 79 dòng cột, vì vậy bạn có thể thấy lỗi độ dài dòng báo cáo của

# Linux/macOS
$ python3 -m pip install flake8

# Windows
$ python -m pip install flake8
3 ngay cả khi sử dụng
for item in items:
  item.perform_action()
74. Bạn có thể định cấu hình
for item in items:
  item.perform_action()
74 để sử dụng 79 cột hoặc định cấu hình
# Linux/macOS
$ python3 -m pip install flake8

# Windows
$ python -m pip install flake8
3 để chấp nhận độ dài dòng dài hơn. Nhiều nhà phát triển Python sử dụng 88 cột thay vì 79 và một số thậm chí còn đặt
for item in items:
  item.perform_action()
74 và
# Linux/macOS
$ python3 -m pip install flake8

# Windows
$ python -m pip install flake8
3 để sử dụng độ dài dòng thậm chí còn dài hơn

Điều quan trọng cần nhớ là PEP8 chỉ là một tập hợp các khuyến nghị, mặc dù các khuyến nghị này được nhiều lập trình viên Python coi trọng. Nhưng không có gì trong Python thực thi hướng dẫn kiểu PEP8. Nếu có điều gì đó trong PEP8 mà bạn hoàn toàn không đồng ý, thì bằng mọi cách, hãy bỏ qua nó. Tuy nhiên, nếu bạn muốn tuân thủ nghiêm ngặt PEP8, các công cụ như

# Linux/macOS
$ python3 -m pip install flake8

# Windows
$ python -m pip install flake8
3 và
for item in items:
  item.perform_action()
74 có thể giúp cuộc sống của bạn dễ dàng hơn rất nhiều

Mẹo số 2. Tránh các vòng lặp kiểu C

Trong các ngôn ngữ như C hoặc C++, việc theo dõi một biến chỉ mục trong khi lặp qua một mảng là phổ biến. Ví dụ: khi được yêu cầu in các phần tử của danh sách, không có gì lạ khi các lập trình viên Python mới đến từ C hoặc C ++ viết một cái gì đó như sau

# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
2

Tuy nhiên, thay vì lặp qua một chỉ mục, bạn có thể lặp trực tiếp qua các mục trong danh sách

# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
3

Tuy nhiên, việc tránh các vòng lặp kiểu C đi sâu hơn nhiều so với việc chỉ lặp trực tiếp qua các mục trong danh sách. Tận dụng các thành ngữ Python, chẳng hạn như hiểu danh sách, các hàm tích hợp như

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
05,
# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
06 và
# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
07 và sử dụng các phương thức đối tượng có thể giúp đưa mã Python của bạn lên một tầm cao mới

Vượt qua "cái bướu trung gian". "

Một email, vào thứ Bảy hàng tuần, để thử thách kỹ năng của bạn và khơi dậy trí tò mò. Luôn ít hơn 5 phút thời gian của bạn

Theo dõi ngay

Đang xử lý đơn đăng ký của bạn Tuyệt vời. Kiểm tra hộp thư đến của bạn và xác nhận đăng ký của bạn Đã xảy ra lỗi khi gửi email

Thích hiểu danh sách hơn các vòng lặp # Correct PLANCK_CONSTANT = 6.62607015e-34 # Incorrect planck_constant = 6.6260715e-34 planckConstant = 6.6260715e-34 08 đơn giản

Một nhiệm vụ lập trình phổ biến là xử lý các phần tử từ một mảng và lưu kết quả vào một mảng mới. Ví dụ: giả sử bạn có một danh sách các số và muốn chuyển đổi nó thành danh sách bình phương của các số đó. Bạn biết rằng bạn nên tránh các vòng lặp kiểu C, vì vậy cuối cùng bạn có thể viết một cái gì đó như thế này

# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
4

Một cách Pythonic hơn để làm điều này là sử dụng cách hiểu danh sách

# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
5

Việc hiểu danh sách có thể khó khăn lúc đầu. Tuy nhiên, nếu bạn đã quen thuộc với ký hiệu bộ xây dựng tập hợp để viết các tập hợp trong toán học, thì cách hiểu danh sách có thể đã quen thuộc.

Đây là cách tôi thường nghĩ về việc hiểu danh sách

  1. Bắt đầu bằng cách tạo một danh sách trống theo nghĩa đen.
    ______309
  2. Điều đầu tiên trong phần hiểu danh sách là bất cứ thứ gì bạn thường đặt bên trong phương thức
    # Correct
    PLANCK_CONSTANT = 6.62607015e-34
    
    # Incorrect
    planck_constant = 6.6260715e-34
    planckConstant = 6.6260715e-34
    
    30 nếu bạn đang xây dựng danh sách bằng cách sử dụng vòng lặp
    # Correct
    PLANCK_CONSTANT = 6.62607015e-34
    
    # Incorrect
    planck_constant = 6.6260715e-34
    planckConstant = 6.6260715e-34
    
    08.
    ______332
  3. Cuối cùng, đặt tiêu đề của vòng lặp
    # Correct
    PLANCK_CONSTANT = 6.62607015e-34
    
    # Incorrect
    planck_constant = 6.6260715e-34
    planckConstant = 6.6260715e-34
    
    08 vào cuối danh sách.
    ______334

Khả năng hiểu danh sách là một khái niệm quan trọng cần nắm vững khi viết mã Pythonic. Nhưng chúng có thể bị lạm dụng. Chúng cũng không phải là kiểu hiểu duy nhất trong Python. Trong các phần sau, bạn sẽ tìm hiểu về các cách hiểu khác, chẳng hạn như biểu thức trình tạo và cách hiểu từ điển, đồng thời xem ví dụ về thời điểm nên tránh hiểu theo danh sách

Sử dụng các chức năng tích hợp sẵn như # Correct PLANCK_CONSTANT = 6.62607015e-34 # Incorrect planck_constant = 6.6260715e-34 planckConstant = 6.6260715e-34 05, # Correct PLANCK_CONSTANT = 6.62607015e-34 # Incorrect planck_constant = 6.6260715e-34 planckConstant = 6.6260715e-34 06 và # Correct PLANCK_CONSTANT = 6.62607015e-34 # Incorrect planck_constant = 6.6260715e-34 planckConstant = 6.6260715e-34 07

Một nhiệm vụ lập trình phổ biến khác là tìm giá trị nhỏ nhất hoặc lớn nhất trong một dãy số. Sử dụng vòng lặp

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
08, bạn có thể tìm số tối thiểu trong danh sách như sau

# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
6

Một cách Pythonic hơn để làm điều này là sử dụng chức năng tích hợp sẵn

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
05

# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
7

Theo cách tương tự, không cần viết vòng lặp để tìm giá trị lớn nhất trong danh sách. Bạn có thể sử dụng chức năng tích hợp sẵn của

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
06

# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
8

Để tìm tổng các số trong một danh sách, bạn có thể viết một vòng lặp

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
08. Nhưng một cách tiếp cận Pythonic hơn là sử dụng hàm
# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
07

# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
9

Một cách sử dụng Pythonic khác của

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
07 là đếm số lượng phần tử của danh sách mà một số điều kiện đáp ứng. Ví dụ: đây là vòng lặp
# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
08 đếm số chuỗi trong danh sách bắt đầu bằng chữ A

# Correct
class SomeThing:
    pass

# Incorrect
class something:
    pass

class some_thing:
    pass
0

Kết hợp

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
07 với khả năng hiểu danh sách sẽ giảm vòng lặp
# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
08 thành một dòng mã

# Correct
class SomeThing:
    pass

# Incorrect
class something:
    pass

class some_thing:
    pass
1

Đáng yêu như vậy, bạn có thể làm cho nó trở nên Pythonic hơn nữa bằng cách thay thế khả năng hiểu danh sách bằng biểu thức trình tạo bằng cách xóa dấu ngoặc xung quanh danh sách

# Correct
class SomeThing:
    pass

# Incorrect
class something:
    pass

class some_thing:
    pass
2

Làm thế nào chính xác để làm việc này?

# Correct
class SomeThing:
    pass

# Incorrect
class something:
    pass

class some_thing:
    pass
3

Trong Python,

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
67 và
# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
68 là các số nguyên ngụy trang.
# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
67 bằng với
# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
04 và
# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
68 bằng với
# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
06

# Correct
class SomeThing:
    pass

# Incorrect
class something:
    pass

class some_thing:
    pass
4

Khi bạn chuyển biểu thức trình tạo hoặc hiểu danh sách cho

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
07, các giá trị
# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
67 và
# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
68 sẽ được xử lý tương ứng như
# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
04 và
# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
06. Vì có hai giá trị
# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
67 và hai giá trị ________ 368 nên tổng cộng bằng ________ 614

Sử dụng

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
07 để đếm xem có bao nhiêu phần tử danh sách thỏa mãn một điều kiện làm nổi bật một điểm quan trọng về khái niệm mã Pythonic. Cá nhân tôi thấy việc sử dụng
# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
07 này rất Pythonic. Xét cho cùng, nó tận dụng một số tính năng của ngôn ngữ Python để tạo ra mã, theo ý kiến ​​​​của tôi, là mã ngắn gọn nhưng vẫn dễ đọc. Tuy nhiên, không phải nhà phát triển Python nào cũng đồng ý với tôi

Người ta có thể lập luận rằng ví dụ này vi phạm một trong những nguyên tắc của Zen of Python. “Rõ ràng là tốt hơn ngầm. ” Rốt cuộc, không rõ ràng rằng

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
67 và
# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
68 là số nguyên và rằng
# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
07 thậm chí sẽ hoạt động với danh sách các giá trị
# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
67 và
# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
68. Hiểu cách sử dụng này của
# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
07 đòi hỏi phải có hiểu biết sâu sắc về các kiểu dựng sẵn của Python

🐍

Để tìm hiểu thêm về

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
67 và
# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
68 dưới dạng số nguyên, cũng như các sự thật đáng ngạc nhiên khác về số trong Python, hãy xem bài viết của tôi 3 điều bạn có thể chưa biết về số trong Python

Không có bộ quy tắc cứng nhắc nào cho bạn biết mã có phải là Pythonic hay không. Luôn luôn có một khu vực màu xám. Sử dụng phán đoán tốt nhất của bạn khi đối mặt với một ví dụ về mã mà bạn cảm thấy như nó có thể nằm trong khu vực màu xám này. Luôn quan tâm đến khía cạnh dễ đọc và đừng ngại liên hệ với đồng nghiệp hoặc sử dụng phương tiện truyền thông xã hội để nhận trợ giúp

Mẹo số 3. Sử dụng đúng cấu trúc dữ liệu

Một phần quan trọng của việc viết mã Pythonic sạch sẽ tập trung vào việc chọn cấu trúc dữ liệu phù hợp cho nhiệm vụ hiện tại. Python nổi tiếng là ngôn ngữ “kèm pin”. Một số pin đi kèm với Python là cấu trúc dữ liệu hiệu quả và sẵn sàng sử dụng

Sử dụng từ điển để tra cứu nhanh

Giả sử bạn có một tệp CSV tên là

# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
25 chứa dữ liệu khách hàng của một doanh nghiệp trông giống như thế này

# Correct
class SomeThing:
    pass

# Incorrect
class something:
    pass

class some_thing:
    pass
5

Giả sử bạn được giao nhiệm vụ viết một chương trình lấy địa chỉ email làm đầu vào và xuất số điện thoại của khách hàng bằng email đó nếu khách hàng đó tồn tại. Làm thế nào bạn sẽ đi về làm điều đó?

Bạn có thể đọc từng hàng của tệp này dưới dạng từ điển bằng cách sử dụng đối tượng

# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
26 từ mô-đun
# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
27

# Correct
class SomeThing:
    pass

# Incorrect
class something:
    pass

class some_thing:
    pass
6

# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
28 là một danh sách các từ điển, vì vậy để tìm khách hàng với một email nhất định, chẳng hạn như
# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
29, bạn cần lặp lại danh sách và so sánh email của từng khách hàng với email mục tiêu cho đến khi tìm thấy đúng khách hàng

# Correct
class SomeThing:
    pass

# Incorrect
class something:
    pass

class some_thing:
    pass
7

Vấn đề với mã này là việc lặp qua danh sách khách hàng không hiệu quả. Nếu có một số lượng lớn khách hàng trong tệp CSV, chương trình của bạn có thể dành một lượng thời gian đáng kể để quét danh sách để tìm khách hàng có email phù hợp. Nếu bạn cần thực hiện kiểm tra này thường xuyên, điều này có thể dẫn đến lãng phí rất nhiều thời gian

Một cách tiếp cận Pythonic hơn là quên việc lưu trữ ứng dụng khách trong danh sách và sử dụng từ điển để ánh xạ ứng dụng khách tới địa chỉ email của họ. Một cách tuyệt vời để làm điều này là hiểu từ điển

# Correct
class SomeThing:
    pass

# Incorrect
class something:
    pass

class some_thing:
    pass
8

Hiểu từ điển rất giống với hiểu danh sách

  1. Bắt đầu bằng cách tạo một từ điển trống.
    ______630
  2. Sau đó, đặt một cặp khóa-giá trị được phân tách bằng dấu hai chấm.
    ______631
  3. Cuối cùng, hãy viết một biểu thức
    # Correct
    PLANCK_CONSTANT = 6.62607015e-34
    
    # Incorrect
    planck_constant = 6.6260715e-34
    planckConstant = 6.6260715e-34
    
    08 lặp qua mỗi hàng trong tệp CSV.
    ______633

Được dịch thành một vòng lặp

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
08, cách hiểu từ điển này sẽ giống như thế này

# Correct
class SomeThing:
    pass

# Incorrect
class something:
    pass

class some_thing:
    pass
9

Với từ điển

# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
28 đã tạo, bạn có thể tìm số điện thoại của khách hàng bằng địa chỉ email của họ mà không cần phải viết thêm bất kỳ vòng lặp nào nữa

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
0

Đoạn mã này không chỉ ngắn hơn việc lặp qua danh sách mà còn hiệu quả hơn nhiều. Python có thể chuyển thẳng đến giá trị chính xác trong từ điển mà không cần bất kỳ vòng lặp nào. Tuy nhiên, có một vấn đề. Nếu không có khách hàng nào trong

# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
28 có email phù hợp, thì một
# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
37 sẽ được nâng lên

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
1

Một cách để xử lý việc này là bắt

# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
37 và in giá trị mặc định nếu không tìm thấy ứng dụng khách nào

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
2

Tuy nhiên, có một cách Pythonic hơn để làm điều này, sử dụng phương thức

# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
39 của từ điển.
# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
39 trả về giá trị tương ứng của khóa nếu khóa tồn tại và
# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
41 nếu ngược lại

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
3

Hãy so sánh hai giải pháp cạnh nhau

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
4

Giải pháp Pythonic ngắn gọn và hiệu quả hơn mà không ảnh hưởng đến khả năng đọc

Tận dụng lợi thế của Set Operations

Bộ là một cấu trúc dữ liệu bị đánh giá thấp trong Python. Do đó, ngay cả các nhà phát triển Python trung cấp cũng có xu hướng bỏ qua các bộ và bỏ lỡ cơ hội sử dụng chúng để tạo lợi thế cho họ

Có lẽ trường hợp sử dụng nổi tiếng nhất cho các bộ trong Python là xóa các bản sao khỏi danh sách

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
5

Nhưng còn rất nhiều điều nữa mà bạn có thể làm với các tập hợp. Một trường hợp sử dụng mà tôi thường sử dụng trong mã của mình là sử dụng các bộ để lọc các giá trị từ một lần lặp một cách hiệu quả. Điều này hoạt động tốt nhất khi bạn cũng cần các giá trị duy nhất

Đây là một ví dụ giả tạo nhưng không phi thực tế. Giả sử chủ cửa hàng có tệp CSV về khách hàng chứa địa chỉ email của họ. Chúng tôi sẽ sử dụng lại tệp

# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
25 từ phần trước. Chủ cửa hàng có một tệp CSV khác về đơn đặt hàng từ tháng trước cũng chứa địa chỉ email. Có thể tệp CSV này được gọi là
# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
43 và trông giống như thế này

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
6

Chủ cửa hàng muốn gửi email cho mọi khách hàng không đặt hàng trong tháng qua với phiếu giảm giá. Một cách để làm điều này là đọc các email từ tệp

# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
25 và
# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
43 và sử dụng khả năng hiểu danh sách để lọc email của khách hàng

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
7

Đoạn mã trên hoạt động tốt và chắc chắn trông giống Pythonic. Nhưng giả sử chủ cửa hàng có hàng triệu khách hàng và đơn đặt hàng mỗi tháng. (Họ dường như rất thành công. ) Lọc email để xác định khách hàng nào sẽ gửi phiếu giảm giá yêu cầu lặp lại toàn bộ danh sách

# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
46. Và nếu có các hàng trùng lặp trong tệp
# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
47 và
# Correct
seconds_per_hour = 3600

# Incorrect
secondsperhour = 3600
secondsPerHour = 3600
43 thì sao?

Một cách tiếp cận Pythonic hơn sẽ là đọc trong ứng dụng khách và sắp xếp các email thành các tập hợp và sử dụng toán tử chênh lệch tập hợp để lọc tập hợp các email của khách hàng

# Correct
PLANCK_CONSTANT = 6.62607015e-34

# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
8

Cách tiếp cận này hiệu quả hơn nhiều so với cách trước vì nó chỉ lặp lại email của khách hàng một lần chứ không phải hai lần. Nó cũng có lợi thế là loại bỏ một cách tự nhiên bất kỳ email trùng lặp nào khỏi cả hai tệp CSV

Ba cuốn sách để học cách viết mã Pythonic

Bạn không thể học cách viết mã Python rõ ràng chỉ trong một đêm. Bạn cần nghiên cứu nhiều ví dụ về mã, thực hành viết mã của riêng mình và tham khảo ý kiến ​​​​của các nhà phát triển Python khác. Để giúp bạn trong hành trình của mình, tôi đã biên soạn một danh sách gồm ba cuốn sách mà tôi thấy vô cùng hữu ích để tìm hiểu về Pythonic.

Cả ba cuốn sách được đề cập dưới đây đều được viết cho các lập trình viên Python trung cấp hoặc cao cấp. Nếu bạn mới bắt đầu với Python và đặc biệt nếu bạn là người mới lập trình nói chung, hãy xem cuốn sách của tôi Những điều cơ bản về Python. Giới thiệu thực tế về Python 3

từ chối trách nhiệm. Các phần sau chứa các liên kết liên kết. Nếu bạn quyết định mua một trong những cuốn sách thông qua liên kết của tôi, tôi sẽ nhận được một khoản hoa hồng nhỏ miễn phí cho bạn

Thủ thuật Python của Dan Bader

Cuốn sách ngắn và ngọt ngào của Dan Bader Thủ thuật Python. Một loạt các tính năng tuyệt vời của Python là nơi khởi đầu tuyệt vời cho các lập trình viên Python từ sơ cấp đến trung cấp để tìm hiểu thêm về cách viết mã Pythonic

Thủ thuật Python sẽ hướng dẫn bạn các mẫu để viết Python rõ ràng, thành ngữ, các phương pháp hay nhất để viết các hàm, cách sử dụng các tính năng lập trình hướng đối tượng của Python một cách hiệu quả và hơn thế nữa

Python hiệu quả của Brett Slatkin

Cuốn sách Python hiệu quả của Brett Slatkin là cuốn sách đầu tiên tôi đọc sau khi học cú pháp Python đã mở rộng tầm mắt của tôi về sức mạnh của mã Pythonic thành ngữ

Như phụ đề của cuốn sách nêu rõ, Python hiệu quả bao gồm 90 cách cụ thể để viết Python tốt hơn. Chỉ riêng chương đầu tiên, có tựa đề Tư duy Python, là một mỏ vàng các mẹo và thủ thuật mà ngay cả những người mới bắt đầu lập trình Python cũng sẽ thấy hữu ích, mặc dù những người mới bắt đầu có thể thấy phần còn lại của cuốn sách khó theo dõi

Thông thạo Python của Luciano Ramalho

Nếu tôi chỉ có thể sở hữu một cuốn sách về Python, cuốn Fluent Python của Luciano Ramalho sẽ là cuốn

Đầy đủ các ví dụ thực tế được hỗ trợ bởi phần trình bày rõ ràng, Fluent Python là một hướng dẫn tuyệt vời cho bất kỳ ai muốn tìm hiểu cách viết mã Pythonic. Tuy nhiên, hãy nhớ rằng Fluent Python không dành cho những người mới bắt đầu lập trình Python. Như đã nêu trong lời nói đầu của cuốn sách

Nếu bạn mới học Python, cuốn sách này sẽ khó theo dõi. Không chỉ vậy, nếu bạn đọc nó quá sớm trong hành trình Python của mình, nó có thể khiến bạn có ấn tượng rằng mọi tập lệnh Python nên tận dụng các phương thức đặc biệt và thủ thuật siêu lập trình. Trừu tượng sớm cũng tệ như tối ưu hóa sớm

Tuy nhiên, các lập trình viên Python có kinh nghiệm sẽ được hưởng lợi rất nhiều từ cuốn sách

Ramalho gần đây đã cập nhật cuốn sách của mình cho Python hiện đại. Hiện tại, phiên bản thứ hai chỉ có sẵn để đặt hàng trước. Tôi thực sự khuyên bạn nên đặt trước phiên bản thứ hai vì phiên bản đầu tiên hiện đã lỗi thời

Bước tiếp theo

Bài báo này bao phủ rất nhiều nền tảng. Bạn đã học

  • Hướng dẫn kiểu PEP8 có thể giúp bạn viết mã Python chuẩn như thế nào
  • Cách tránh các vòng lặp kiểu C thông qua phép lặp trực tiếp và tận dụng một số hàm tích hợp sẵn của Python
  • Tại sao chọn cấu trúc dữ liệu phù hợp cho phép bạn viết mã ngắn hơn mà hiệu quả hơn

Những mẹo này sẽ giúp bạn viết nhiều mã Pythonic hơn, nhưng chúng mới chỉ là bước khởi đầu. Làm chủ Python mất nhiều năm. Trong những năm bạn làm việc để thành thạo Python, các tiêu chuẩn được chấp nhận đối với mã Pythonic có thể thay đổi, vì vậy điều quan trọng là phải luôn cập nhật các phương pháp hay nhất hiện tại. Subreddit r/learnpython có thể là một nơi tốt để đặt câu hỏi và nhận trợ giúp. Tôi cũng luôn sẵn lòng trả lời các câu hỏi trên Twitter

Nhưng bước đầu tiên là bắt tay vào làm và thực hành những gì bạn đã học. Như Zen của Python nói. "Bây giờ tốt hơn là không bao giờ. "