Một số đặc điểm của Python làm cho nó độc đáo như ngôn ngữ của chính nó là gì? [đóng cửa]


12

Một số đặc điểm của Python làm cho nó độc đáo như ngôn ngữ của chính nó là gì? Tôi đang tìm kiếm bất kỳ loại đặc điểm nào, từ tốt đến xấu, hữu ích đến cản trở, cú pháp đến sử dụng trong thế giới thực, nhưng các quan sát không tối nghĩa sẽ hữu ích nhất cho nhà phát triển trung bình.

Tôi là người mới ở đây, vì vậy những điều trực quan có thể cần được giải thích .....


9
Python không phải là duy nhất, nó không chứa một tính năng duy nhất không thấy trong bất kỳ ngôn ngữ nào khác.
SK-logic

10
Đó là ngôn ngữ duy nhất tôi biết được đặt theo tên của Monty Python ...
yannis

@ SK-logic câu hỏi là về đặc điểm, trong đó các tính năng là một tập hợp con. Không có đặc điểm duy nhất cho Python?
kojiro

@kojiro, tôi chưa bao giờ thấy một định nghĩa chính thức về "đặc điểm", vì vậy tôi không muốn đoán.
SK-logic

1
@kojiro, các tính năng PL thường được hiểu là cả cú pháp và ngữ nghĩa của nó. Và cả hai đều được xác định chính thức.
SK-logic

Câu trả lời:


22

Bạn sẽ có một thời gian khó khăn để tìm các tính năng hoàn toàn độc đáo . Hầu hết các tính năng ngôn ngữ trong sự tồn tại đã được thông qua bằng nhiều ngôn ngữ kể từ khi thành lập. Một số có thể hiếm hơn, chủ yếu là vì chúng mới hoặc vẫn còn mơ hồ hoặc đã chết vì lý do chính đáng. Tuy nhiên, thậm chí sau đó bạn sẽ tốt hơn khi nhìn vào sự kết hợp của các tính năng.

Điều đó nói rằng, một số tính năng của Python sẽ tạo nên sự kết hợp tương đối độc đáo. Ít nhất là tôi không biết bất kỳ ngôn ngữ nào từ xa là phổ biến (và thực tế) với bộ tính năng chủ yếu chồng chéo. Như đã lưu ý trong các bình luận, Ruby khá gần gũi, tuy nhiên vẫn có nhiều sự khác biệt.

  • Metaclass dựa trên siêu lập trình. Về cơ bản, chạy mã tùy ý về việc tạo lớp. Làm cho việc tùy chỉnh lớp rất tốt với rất ít công việc ở phần cuối nhận - ví dụ: đối với Ánh xạ quan hệ đối tượng (ORM), các lớp máy khách có thể được viết như bình thường với một vài dòng bổ sung như attr = SomeDataType()và một tấn mã được tạo tự động. Một ví dụ về điều này là "mô hình" của Django .
  • Bạn được khuyến khích sử dụng các trình vòng lặp cho mọi thứ . Điều này đặc biệt rõ ràng trong 3.x, trong đó hầu hết các lựa chọn thay thế dựa trên danh sách với tương đương dựa trên iterator đã bị bãi bỏ để ủng hộ cái sau. Các trình vòng lặp cũng đóng vai trò là giao diện phổ quát cho các bộ sưu tập (cả những bộ bạn thực sự có trong bộ nhớ và những bộ bạn chỉ cần một lần và do đó tạo ra với các tính năng bên dưới). Thu thập bất khả tri, hiệu quả O(1)không gian ( không gian cho kết quả trung gian thường diễn ra tự nhiên, rất ít nhiệm vụ thực sự cần tất cả các mục trong bộ nhớ), việc xử lý dữ liệu có thể tổng hợp chưa bao giờ dễ dàng hơn.
  • Biểu thức máy phát điện, liên quan đến ở trên. Nhiều người sẽ nghe về việc hiểu danh sách (tạo một danh sách từ một lần lặp khác, lọc và ánh xạ trong quy trình, với cú pháp rất thuận tiện). Hãy quên chúng đi, chúng là cú pháp đường, một trường hợp đặc biệt. Các biểu thức của trình tạo rất gần nhau về mặt cú pháp và cuối cùng dẫn đến một chuỗi các mục rất giống nhau, nhưng chúng tạo ra kết quả một cách lười biếng (và do đó chiếm O(1)không gian trừ khi bạn rõ ràng giữ kết quả xung quanh).
  • yield, mà chủ yếu làm cho các trình lặp viết (được gọi là máy phát điện ở đây) đẹp hơn nhiều. Họ là anh cả của những người trên, hỗ trợ tất cả các loại luồng kiểm soát. C # có một cái gì đó tương tự, với cùng một từ khóa. Nhưng yieldcũng bị quá tải để hỗ trợ một loại coroutines hạn chế (ví dụ Lua có sự hỗ trợ phức tạp hơn), tuy nhiên vẫn được sử dụng tốt bởi những người thông minh làm việc trong các vấn đề khó khăn. Hai ví dụ ngoài đỉnh đầu của tôi: Phân tích cú pháp gốc đệ quy với backtracing và không giới hạn ngăn xếpI / O không đồng bộ (với cú pháp thuận tiện).
  • Phân công đa mục tiêu và giải nén lặp. Bài tập về steroid. Không chỉ bạn có thể gán cho nhiều giá trị cùng một lúc (ngay cả khi hoán đổi giá trị và khi lặp lại - for key, value in mapping.items()), bạn có thể giải nén bất kỳ lần lặp nào có độ dài đã biết (trung thực, chủ yếu là bộ dữ liệu) thành nhiều biến. Vì 3.x thậm chí còn thiết thực đối với các bộ sưu tập có độ dài không xác định vì bạn có thể chỉ định một vài biến lấy các mục đơn lẻ và một biến lấy bất cứ thứ gì còn lại : first, *everything_in_between, last = values.
  • Mô tả , có lẽ là mạnh nhất trong số các cách khác nhau để tùy chỉnh truy cập thuộc tính. Có các thuộc tính (như trong C #, nhưng không có hỗ trợ ngôn ngữ đặc biệt), phương thức tĩnh, phương thức lớp, v.v ... tất cả được thực hiện dưới dạng mô tả. Chúng cũng là những đối tượng hạng nhất. Chỉ một tuần trước, tôi đã phải đối mặt với mã lặp đi lặp lại và phức tạp trong các thuộc tính - vì vậy tôi đã viết một hàm nhỏ tạo ra phần lặp lại và gói nó vào một properyđối tượng.
  • Quy tắc hoàn toàn việt vị (indentaion cho phân định khối). Tôi cố tình đặt cái này cuối cùng. Mặc dù nó phân biệt Python, nhưng nó không thực sự nổi bật trong lập trình hàng ngày một khi bạn đã quen với nó (hoặc ít nhất đó là kinh nghiệm của tôi).

Tôi vẫn còn một chút người mới ở Ruby nhưng tôi nghĩ rằng tất cả chỉ là điểm cuối cùng? Dù bằng cách nào tôi cũng đồng ý "duy nhất" có thể sẽ không được tìm thấy trong Python nhưng "không phổ biến giữa các ngôn ngữ hàng đầu khác" có thể.
Giàn khoan

@Rig: Tôi không phải là chuyên gia về Ruby, nhưng tôi đã không thấy siêu dữ liệu (Ruby chắc chắn cũng mạnh mẽ về lập trình siêu dữ liệu và có thể sử dụng nó cho các kết thúc tương tự, nhưng ấn tượng của tôi là nó đạt được khác nhau), cũng không phải là biểu thức của trình tạo (mặc dù dường như có coroutines), cũng không thể giải nén (mặc dù có sự phân công đa mục tiêu) cũng như các mô tả trong Ruby. Có, Ruby và Python trùng nhau. Nhưng có sự khác biệt .

Tốt, +1. Đối với tôi, "gán trên steroid" thực sự là "khớp mẫu của người nghèo", tuy nhiên vẫn cực kỳ hữu ích :) Tôi cũng nhận thấy sự linh hoạt của việc truyền tham số trong các hàm: *args**kwargs, cách dễ dàng để ánh xạ các tuple và dicts vào các tham số, v.v. .
9000

Tôi tin rằng lisp phổ biến với CLOS đạt tất cả các điểm trừ việc sử dụng cú pháp dựa trên bố cục. Haskell không hướng đối tượng (mặc dù có các phần mở rộng OO) nhưng khác với điểm siêu dữ liệu tôi tin rằng nó phù hợp với tất cả các tính năng này.
Jules

3

Tôi đoán điều duy nhất làm cho Python trở nên độc đáo là sự kết hợp đặc biệt của các tính năng mà nó thể hiện. Điều này sẽ đúng với hầu hết các ngôn ngữ lập trình.

Hoặc có thể có một điều nhỏ: Tôi chưa thấy cách Python chuyển một cách rõ ràng selfnhư một tham số chính thức cho các hàm thành viên đối tượng được thực hiện bằng bất kỳ ngôn ngữ nào khác. Đó là một điều nhỏ nhặt và tôi không thấy điều này thay đổi bất cứ điều gì thực sự.

Nhưng tôi không rành về Python lắm, nên chắc chắn có những thứ tôi đang thiếu!


@delnan: Ah, tôi đã bỏ lỡ "rõ ràng vượt qua chính mình như một tham số chính thức" .. Đoán đó là những gì tôi nhận được khi đọc lúc 2 giờ sáng;)
Demian Brecht

4
Bản thân rõ ràng cũng xảy ra ở Oberon, fwiw
grrussel

Một tham số tự rõ ràng cũng được sử dụng trong hệ thống đối tượng lisp phổ biến. CLOS cung cấp nhiều phương thức, tuy nhiên, điều đó có nghĩa là tham số tự không theo bất kỳ cách nào đặc biệt, giống như trong python.
Jules

1

Việc xử lý tự động các tài liệu để trở thành tài sản của chủ sở hữu của họ. Nói chung, tất cả các tính năng hướng nội tuyệt vời của Python làm cho nó trở thành một ngôn ngữ rất độc đáo, từ khả năng sử dụng trợ giúp () đến khả năng sử dụng __doc__như một thuộc tính hạng nhất của một đối tượng. Ví dụ:

>>> class DocStringException(Exception):
...     """Error message is the same as docstring"""
...     def __str__(self):
...         return repr(self.__doc__)
... 
>>> class ExampleException(DocStringException):
...     """An example happened"""
... 
>>> raise ExampleException
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.ExampleException: 'An example happened'

Các tính năng hướng nội hữu ích khác:

  • help / help () - trợ giúp với trình thông dịch / trợ giúp với một đối tượng
  • từ khóa - từ khóa python
  • người địa phương () - lấy tên địa phương
  • globalals () - lấy tên toàn cầu
  • dir () - có được các thuộc tính và phương thức của đối tượng
  • phương pháp .mro. , ngay bây giờ - hiểu kế thừa
  • id () - lấy địa chỉ bộ nhớ của một đối tượng

Ruby khá nhiều có sức mạnh tương tự, cũng như Common Lisp, Clojure và nhiều ngôn ngữ năng động khác mà tôi tin.
Torbjørn

@ Torbjørn sức mạnh nào? Các tài liệu tự động, hoặc các tính năng hướng nội?
kojiro

Tôi đã suy nghĩ về cả hai. Không chính xác như nói, nhưng trong tinh thần. Tôi không tin Ruby có khả năng tài liệu tương tự, nhưng chắc chắn là hướng nội. CL và Clojure có cả hai tính năng - và tôi tin rằng sự hướng nội vượt xa những gì bạn sẽ tìm thấy trong Python, vì nó là đồng âm .
Torbjørn

1
  1. Generator Expressions
  2. input()Hãy để tôi giải thích, tôi chưa thấy một ngôn ngữ (cho đến nay), nơi bạn có thể gán một giá trị cho một câu lệnh in một cái gì đó, nó giống như của ruby print/gets, nhưng với một giá trị được gán cho bản in, thay vì:print "Foo" bar = gets
  3. yield
  4. Nhiều loại bộ dữ liệu: ordereddict, namedtuple, array, list, tuple, dictionary

Các biểu thức của trình tạo có thể được triển khai trong Haskell bằng cách hiểu danh sách (danh sách Haskell là lười biếng, không giống như danh sách python, vì vậy không cần cú pháp cụ thể cho việc này). Theo "input" Tôi giả sử bạn có nghĩa là hàm python 3 của tên đó (vì hàm python 2 là nguy hiểm và không nên sử dụng). Đúng là đây là một sự kết hợp bất thường của hành vi (mặc dù nó có trong javascript - window.prompt - và BASIC, đó là nơi tôi đoán python đã mượn nó) nhưng nó có thể được lập trình viên thực hiện một cách tầm thường ("input s = putStrLn s >> getStrLn "sẽ làm điều đó cho haskell).
Jules

Một ngôn ngữ lười biếng như Haskell không thực sự cần năng suất - nó chỉ có thể trả về một danh sách được xây dựng bằng các phương thức thông thường và các mục sẽ được tạo theo yêu cầu. Mặc dù vậy, thư viện bao gồm một triển khai rõ ràng của coroutines. Thư viện chuẩn Haskell chứa tất cả các cấu trúc dữ liệu được đề cập và nhiều cấu trúc dữ liệu khác.
Jules

-2

Vấn đề là, Python nằm trong số rất ít ngôn ngữ có chi phí cú pháp cực thấp mang lại cho nó sức mạnh biểu cảm to lớn: hiểu / liệt kê / tập hợp, hiệu suất, trang trí, eval, lập trình lớp meta, hướng nội, cấu trúc dữ liệu tích hợp được tối ưu hóa (danh sách, dicts, bộ), tất cả những điều đó âm mưu theo một cách rất hay để cung cấp cho bạn (nhà phát triển) sức mạnh để thể hiện suy nghĩ của bạn bằng mã ngắn gọn và thanh lịch gần như nhanh như bạn có thể nghĩ. Tôi thực sự không thể nghĩ ra bất kỳ ngôn ngữ nào khác với bộ tính năng sát thủ này kết hợp với nhau.


1
Nếu bạn nghĩ Python có chi phí cú pháp thấp (mặc dù có ngữ pháp phức tạp khó hiểu và lượng cú pháp tương đối lớn), bạn nghĩ gì về Scheme?
Tikhon Jelvis

Eval thực sự không nên được sử dụng cho bất kỳ chương trình sản xuất nào (mặc dù tôi cấp nó có thể hữu ích cho việc hack nhanh). Như thể hiện trong các bình luận cho các câu hỏi khác, python không có nghĩa là duy nhất có các tính năng này. Tôi tin, ví dụ, clojure đó có tất cả các tính năng bạn liệt kê, và hầu hết có thể được thực hiện với lisp thông thường.
Jules

-4

Tôi muốn nói rằng nó sử dụng thụt đầu dòng để kèm theo nếu các câu lệnh và vòng lặp. Chưa thấy điều đó trong bất kỳ ngôn ngữ nào khác.

Tôi nghĩ nó rất tiện dụng vì nó làm cho việc xáo trộn mã trăn khó khăn hơn đáng kể!

Nó dường như cũng thực thi một cách gọn gàng theo cách thức ngoại trừ các chức năng, và nó có thể được hiểu như vậy là tốt.


2
Wikipedia biết một màn hình đầy đủ các ngôn ngữ cũng làm điều đó. Nó được gọi là quy tắc phụ .

3
Tôi không hiểu Nó dường như cũng thực thi một cách gọn gàng theo cách thức ngoại trừ các chức năng, và nó có thể được hiểu như vậy là tốt. Nó có nghĩa là gì?
kojiro
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.