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
Gõ
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
- 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
- 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.
Đ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
1Viế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ã saufor item in items:
item.perform_action[]
7Chạ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úngfor item in items:
item.perform_action[]
9Mỗ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] 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# 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ìnhTrì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
0Sau 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
3Bạ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
1Mộ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ềuMẹo số 2. Tránh các vòng lặp kiểu CTrong 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
2Tuy 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
3Tuy 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ớiVượ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
Đ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
# Correct
PLANCK_CONSTANT = 6.62607015e-34
# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
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
4Mộ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
5Việ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
- Bắt đầu bằng cách tạo một danh sách trống theo nghĩa đen.
______309 - Đ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
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.# Correct PLANCK_CONSTANT = 6.62607015e-34 # Incorrect planck_constant = 6.6260715e-34 planckConstant = 6.6260715e-34
______332 - Cuối cùng, đặt tiêu đề của vòng lặp
08 vào cuối danh sách.# Correct PLANCK_CONSTANT = 6.62607015e-34 # Incorrect planck_constant = 6.6260715e-34 planckConstant = 6.6260715e-34
______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
# Correct
PLANCK_CONSTANT = 6.62607015e-34
# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
# Correct
PLANCK_CONSTANT = 6.62607015e-34
# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
# Correct
PLANCK_CONSTANT = 6.62607015e-34
# Incorrect
planck_constant = 6.6260715e-34
planckConstant = 6.6260715e-34
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
6Mộ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
7Theo 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
9Mộ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
0Kế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
2Là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
3Trong 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
4Khi 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 ________ 614Sử 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ôiNgườ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 PythonKhô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ệuMộ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
5Giả 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
7Vấ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
8Hiểu từ điển rất giống với hiểu danh sách
- Bắt đầu bằng cách tạo một từ điển trống.
______630 - Sau đó, đặt một cặp khóa-giá trị được phân tách bằng dấu hai chấm.
______631 - Cuối cùng, hãy viết một biểu thức
08 lặp qua mỗi hàng trong tệp CSV.# Correct PLANCK_CONSTANT = 6.62607015e-34 # Incorrect planck_constant = 6.6260715e-34 planckConstant = 6.6260715e-34
______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
9Vớ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
1Mộ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
2Tuy 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
3Hã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
4Giả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
5Như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
6Chủ 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
8Cá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ã PythonicBạ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 theoBà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ờ. "