Які деякі характеристики Python роблять його унікальним як власну мову? [зачинено]


12

Які деякі характеристики Python роблять його унікальним як власну мову? Я шукаю будь-які характеристики, від доброго до поганого, корисного до перешкод, синтаксису до реального використання, але неясні спостереження були б найбільш корисними для середнього розробника.

Я тут новачок, тому інтуїтивні речі, можливо, потрібно буде пояснити .....


9
Python не є унікальним, він не містить жодної унікальної функції, яку не можна побачити жодною іншою мовою.
SK-логіка

10
Це єдина мова, яку я знаю, що названа на честь Монті Пітона ...
yannis

@ SK-логіка, питання стосується характеристик, функції яких є підмножиною. Чи немає характеристик, унікальних для Python?
kojiro

@kojiro, я ніколи не бачив офіційного визначення поняття "характеристика", тому я вважаю за краще не здогадуватися.
SK-логіка

1
@kojiro, особливості PL зазвичай розуміють як його синтаксис, так і семантику. І те й інше формально визначено.
SK-логіка

Відповіді:


22

Вам буде важко знайти функції, які абсолютно унікальні . Більшість існуючих мовних ознак були прийняті більш ніж однією мовою з моменту їх створення. Деякі можуть бути рідше, головним чином тому, що вони або нові, і все ще в невідомості, або вимерли з поважних причин. Тим не менш, навіть тоді вам буде краще переглянути комбінації функцій.

Однак, кілька особливостей Python повинні зробити порівняно унікальне поєднання. Принаймні, я не знаю жодної мови віддалено, як популярної (і практичної) з набором функцій, що в основному перекриваються. Як зазначається в коментарях, Рубі досить близька, але все ж існують численні відмінності.

  • Метапрограмування на основі метакласу . В основному працює довільний код про створення класу. Робить дуже приємне налаштування класу з дуже малою роботою на отриманому кінці - наприклад, для об'єктно-реляційного картографування (ORM), клієнтські класи можуть записуватися як звичайно за допомогою кількох додаткових рядків, наприклад, attr = SomeDataType()і тонна коду генерується автоматично. Прикладом цього є "моделі" Джанго .
  • Вам рекомендується використовувати ітератори для всього . Це особливо очевидно в 3.x, коли більшість альтернатив на основі списку з еквівалентом на основі ітератора було скасовано на користь останнього. Ітератори також служать універсальним інтерфейсом для колекцій (як тих, кому ви насправді є в пам'яті, так і тих, які вам потрібні лише один раз, і таким чином створюйте за допомогою наведених нижче функцій). Колекційно-агностичний, просторний ( O(1)простір для проміжних результатів часто випливає природним шляхом; дуже мало завдань насправді потребує всіх об'єктів в пам'яті одразу), складання даних для компонування ніколи не було простіше.
  • Генераторні вирази, пов'язані з вищезазначеним. Багато хто почує про розуміння списку (створення списку з іншого ітерабельного, фільтрування та відображення в процесі з дуже зручним синтаксисом). Забудь про них, вони синтаксичний цукор, особливий випадок. Вирази генератора синтаксично дуже близькі і в кінцевому підсумку призводять до тієї самої послідовності елементів, але вони дають результати ліниво (і, таким чином, займають O(1)місце, якщо ви явно не тримаєте результати навколо).
  • yield, що в основному робить ітератори запису (тут називаються генераторами) набагато приємніше. Вони є старшим братом вище, підтримуючи всі види контролю. C # має щось подібне, з тим самим ключовим словом. Але yieldвін також перевантажений підтримкою обмеженого роду процедур (наприклад, Луа має більш досконалу підтримку), які, тим не менш, були використані розумними людьми, що працюють над важкими проблемами. Два приклади вгорі моєї голови: рекурсивний аналіз спуску з зворотним ходом та без обмеження стека та асинхронний введення / виведення (зі зручним синтаксисом).
  • Багатоцільове призначення та ітерабельне розпакування. Призначення на стероїди. Не тільки ви можете призначити відразу декілька значень (навіть для заміни значень і при повторенні - for key, value in mapping.items()), ви можете розпакувати будь-який ітерабельний ряд відомої довжини (якщо чесно, в основному кортежі) у кілька змінних. Оскільки 3.x це навіть практично для колекцій невідомої довжини , як ви можете вказати кілька змінних , приймаючи окремі елементи і один захоплення , що залишилося: first, *everything_in_between, last = values.
  • Дескриптори , мабуть, найпотужніші серед різних способів налаштування доступу до атрибутів. Є властивості (як у C #, але без спеціальної підтримки мови), статичні методи, методи класу тощо, всі реалізовані як дескриптори. Вони теж першокласні об'єкти. Лише тиждень тому я зіткнувся з повторюваним і хитрим кодом властивостей - тому я написав невелику функцію, що генерує повторювану частину і загортає її в properyоб'єкт.
  • Чисто офсайдне правило (відступ для розмежування блоків). Я остаточно це поставив навмисно. Хоча це і відрізняє Python, він насправді не виділяється у повсякденному програмуванні, коли ви звикли до нього (або, принаймні, це мій досвід).

Я все ще трохи новачка в Ruby, але я думаю, що вражає всіх, крім останньої точки, а також? У будь-якому випадку я погоджуюся, що "унікальний", ймовірно, не знайдеться в Python, але "не поширений серед інших топ-мов".
Ріг

@Rig: Я не експерт Рубі, але я не бачив ні метакласів (звичайно, Рубі настільки ж потужний щодо метапрограмування, і може використовувати його для подібних цілей, але моє враження було, що це досягається інакше), ні генератори, ні генераторні вирази (хоча, здається, є спроби), ні ітерабельне розпакування (хоча багатоцільове призначення), ні дескриптори в Ruby. Так, Ruby і Python перекриваються. Але є відмінності .

Добре, +1. Для мене "призначення на стероїди" насправді "відповідність шаблону бідній людині", але все ж неймовірно корисна :) Я також зауважую, наскільки гнучким є передача параметрів у функціях: *argsі **kwargs, безболісний спосіб відображення кортежів і диктує параметри тощо .
9000

Я вважаю, що звичайний ліс з CLOS вражає всі моменти, крім використання синтаксису на основі макета. Haskell не є об'єктно-орієнтованим (хоча є розширення OO), але крім точки метакласу, я вважаю, що він відповідає всім цим особливостям.
Жуль

3

Я думаю, що єдине, що робить Python унікальним, - це особливе поєднання особливостей, які він піддається. Це справедливо для більшості мов програмування.

Або може бути одна невелика річ: я не бачив, як Python явно передає selfформальний параметр для об'єктних функцій-членів, виконаних будь-якою іншою мовою. Це невелика річ, і я не бачу, як це щось змінює насправді.

Але я не дуже добре володію Python, тому можуть бути речі, яких я точно не вистачає!


@delnan: Ага, я пропустив "явно передаю себе як формальний параметр". Здогадайтесь, що я отримую для читання о 2 ранку;)
Дем'ян Брехт

4
Явне самоврядування трапляється також в Oberon, fwiw
grrussel

Явний параметр self використовується також у загальній системі об'єктів Lisp. CLOS надає мультиметоди, однак це означає, що параметр self ніяк не особливий, як це в python.
Жуль

1

Автоматична обробка документообігів, щоб стати властивостями їх власника. Загалом, всі особливості самоаналізу Python роблять його дуже унікальною мовою, від здатності використовувати help () до здатності використовувати __doc__як першокласне властивість об'єкта. Наприклад:

>>> 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'

Інші корисні функції самоаналізу:

  • help / help () - допомога з перекладачем / допомога з об’єктом
  • ключові слова - ключові слова пітона
  • localals () - отримайте місцеві назви
  • globals () - отримати глобальні назви
  • dir () - отримати властивості та методи об’єкта
  • метод .mro , issubclass - розуміння спадкування
  • id () - отримання адреси пам'яті об'єкта

Ruby в значній мірі має таку ж силу, як і звичайні Lisp, Clojure та багато інших, динамічні мови, на які я вірю.
Torbjørn

@ Torbjørn яка сила? Автоматична документація чи функції самоаналізу?
kojiro

Я думав над обома. Не точно сказати, але по духу. Я не вірю, що Рубі володіє тими ж документаційними здібностями, але самоаналіз точно. У CL і Clojure є обидві особливості - і я вважаю, що самоаналіз там виходить далеко за рамки того, що ви знайдете в Python, оскільки це гомоніконічність .
Torbjørn

1
  1. Generator Expressions
  2. input()Поясню, я не бачив мови (поки що), де ви можете призначити значення заяві, яка щось друкує, це як рубінове print/gets, але зі значенням, призначеним для друку, замість:print "Foo" bar = gets
  3. yield
  4. Багато типів наборів даних: ordereddict, namedtuple, array, list, tuple, dictionary

Вирази генератора можуть бути реалізовані в Haskell за допомогою розуміння списку (списки Haskell ледачі, на відміну від списків python, тому для цього не потрібен конкретний синтаксис). Під "введенням" я припускаю, що ви маєте на увазі функцію python 3 цього імені (оскільки функція python 2 небезпечна і не повинна використовуватися). Це правда, що це незвичайна комбінація поведінки (хоча вона присутня у javascript - window.prompt - та BASIC, саме там, напевно, питон запозичив її), але програміст може тривіально реалізувати ("input s = putStrLn s >> getStrLn "зробить це для haskell).
Жуль

Ледача мова, як Haskell, насправді не потребує врожайності - вона може просто повернути список, створений за допомогою звичайних методів, а елементи будуть генеруватися на вимогу. Незважаючи на це, бібліотека включає в себе явну реалізацію супротивників. Стандартна бібліотека Haskell містить усі згадані структури даних та багато іншого.
Жуль

-2

Річ у тім, що Python є одним з небагатьох мов з надзвичайно низькою синтаксичною накладною витратою, що надає йому величезних виразних повноважень: опис списку / набору / дикту, вихід, декоратори, eval, програмування мета класів, самоаналіз, оптимізовані вбудовані структури даних (списки, дикти, набори), усі ці речі мають змову дуже приємно, щоб дати вам (розробнику) повноваження висловлювати свої думки в стислій і вишуканий код майже так само швидко, як ви можете подумати. Я не можу реально придумати будь-які інші мови з цим набором вбивць, поєднаних разом.


1
Якщо ви думаєте, що Python має низькі синтаксичні накладні витрати (незважаючи на нецензурно складну граматику та відносно велику кількість синтаксичного цукру), що ви думаєте про схему?
Тихон Єлвіс

Eval дійсно не повинен використовуватися для жодної виробничої програми (хоча я даю, це може бути зручно для швидких злому). Як показано в коментарях до інших питань, python аж ніяк не унікальний у наявності цих особливостей. Я вважаю, наприклад, що у clojure є всі перелічені вами функції, і більшість з них можна зробити за допомогою звичайного lisp.
Жуль

-4

Я б сказав, що це використання відступів, щоб укласти, якщо заяви та цикли. Не бачили цього на жодній іншій мові.

Я думаю, що це дуже зручно, тому що це суттєво ускладнює придушення коду python!

Це також, здається, виконується в акуратному рядку за рядком, за винятком функцій, і це також може бути інтерпретовано як таке, що приємно.


2
Вікіпедія знає екран, повний мов, які також роблять це. Це називається правилом поза стороною .

3
Я не розумію. Це також, здається, виконується в акуратному рядку за рядком, за винятком функцій, і це теж можна інтерпретувати як таке, що приємно. Що це означає?
kojiro
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.