Pythonic có nghĩa là gì? [đóng cửa]


88

Trên nhiều trang web, tôi thường thấy các bình luận rằng mã không phải là pythonic, hoặc có một cách khó hiểu hơn để đạt được cùng một mục tiêu.

Pythonic có nghĩa là gì trong bối cảnh này? Ví dụ, tại sao

while i < someValue:
   do_something(list[i])
   i += 1

không phải pythonic trong khi

for x in list:
   doSomething(x)

là pythonic?



Đây là một câu hỏi lạc đề. Bạn có thể cung cấp một mẫu mã nhỏ để làm cho nó có chủ đề hơn.
ρss

Câu trả lời:


103

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

Pythonic có nghĩa là mã không chỉ đú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 mà nó dự định được sử dụng.

Điều này có lẽ dễ giải thích nhất bằng ví dụ phủ định, như trong bài viết được liên kết từ các câu trả lời khác. Ví dụ về mã không phức tạp thường đến từ những người dùng ngôn ngữ khác, những người này 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, cố gắng đánh dấu vào các mẫu thường được sử dụng 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 i in (i; i < items.length ; i++)
 {
  n = items[i];
 ... now do something
 }

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ụng sẽ sạch hơn

for i in items:
  i.perform_action()

Hoặc, ngay cả một biểu thức trình tạo

(i.some_attribute for i in items)

Vì vậy, về cơ bản, khi ai đó nói điều gì đó là không thông thường, 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 trăn.

import thisvào dòng lệnh cung cấp một bản tóm tắt về các nguyên tắc của Python. Ít được biết đến là mã nguồn import thisđược quyết định, và theo thiết kế, không phức tạp! Hãy xem nó để biết ví dụ về những điều không nên làm.


26
Btw, mã nguồn cho "nhập cái này" ở đây: github.com/python/cpython/blob/master/Lib/this.py
Gautam

Ví dụ trong một lĩnh vực khác là gì? Như nấu ăn, thiết kế, lái xe ..?
Daniel Springer

2
Đối với một ví dụ về một số mã phức tạp hơn, việc triển khai "không phức tạp" của mật mã Vigenere được thực hiện dần dần "pythonic" hơn trong câu trả lời này (tiết lộ: mã và ý kiến ​​của tôi): stackoverflow.com/questions/2490334/…
Nick

18
Tôi nghĩ rằng tôi nên để lại bình luận ở đây với tên người dùng của tôi
Pythonic

Cũng có lẽ cần lưu ý rằng thuật ngữ chung là "thành ngữ"
Louis Maddox
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.