Каковы некоторые характеристики Python, которые делают его уникальным в качестве собственного языка? [закрыто]

12

Каковы некоторые характеристики Python, которые делают его уникальным в качестве собственного языка? Я ищу любые характеристики, от хорошего до плохого, полезного для помех, синтаксиса и реального использования, но неясные наблюдения были бы наиболее полезными для среднего разработчика.

Я новичок здесь, поэтому интуитивные вещи, возможно, должны быть объяснены .....

Джон
источник
9
Python не уникален, он не содержит ни одной уникальной функции, невиданной ни на одном другом языке.
SK-logic
10
Это единственный язык, который я знаю, названный в честь Монти Пайтона ...
Яннис
@ SK-логика, речь идет о характеристиках, из которых особенности являются подмножеством. Нет ли каких-либо характеристик, уникальных для Python?
Кодзиро
@kojiro, я никогда не видел формального определения «характеристики», поэтому предпочел бы не догадываться.
SK-logic
1
@kojiro, функции PL обычно понимаются как его синтаксис и семантика. И оба формально определены.
SK-logic

Ответы:

22

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

Тем не менее, некоторые функции Python должны составлять относительно уникальную комбинацию. По крайней мере, я не знаю, чтобы какие-либо языки были настолько популярны (и практичны) с в основном перекрывающимся набором функций. Как отмечается в комментариях, Ruby довольно близок, но, тем не менее, существует множество отличий.

  • Метапрограммирование на основе метаклассов . В основном, запуск произвольного кода при создании класса. Делает для очень хорошей настройки класса с очень небольшим количеством работы на конце получения - например, для объектно-реляционного отображения (ORM), клиентские классы могут быть написаны как обычно с несколькими дополнительными строками, такими как, attr = SomeDataType()и тонна кода генерируется автоматически. Примером этого являются «модели» Джанго .
  • Вам рекомендуется использовать итераторы для всего . Это особенно очевидно в 3.x, где большинство альтернатив на основе списка с эквивалентом на основе итераторов были упразднены в пользу последнего. Итераторы также служат почти универсальным интерфейсом для коллекций (как тех, которые у вас есть в памяти, так и тех, которые вам нужны только один раз и, следовательно, создаются с помощью функций ниже). Независимый от сбора, эффективный в O(1)пространстве ( пространство для промежуточных результатов часто следует естественным образом, очень немногим задачам фактически нужны все элементы в памяти одновременно), сжатие компонованных данных никогда не было проще.
  • Генератор выражений, относящихся к вышесказанному. Многие будут слышать о списках (создание списка из другого итератора, фильтрация и отображение в процессе, с очень удобным синтаксисом). Забудьте о них, они синтаксический сахар, особый случай. Выражения генератора очень близки по синтаксису и в конечном итоге приводят к той же самой последовательности элементов, но они дают результаты лениво (и, таким образом, занимают O(1)место, если вы не сохраните результаты явно).
  • yield, которые в основном делают написание итераторов (называемых здесь генераторами) намного приятнее. Они - старший брат всего вышеперечисленного, поддерживающий все виды контроля. В C # есть нечто похожее, с тем же ключевым словом. Но yieldон также перегружен для поддержки ограниченного вида сопрограмм (например, Lua имеет более сложную поддержку), который, тем не менее, нашел хорошее применение умным людям, работающим над сложными проблемами. Два примера из головы: синтаксический анализ рекурсивного спуска с обратным трассированием и без ограничения стека и асинхронный ввод-вывод (с удобным синтаксисом).
  • Многоцелевое назначение и повторяемая распаковка. Назначение на стероиды. Мало того, что вы можете назначить несколько значений одновременно (даже для замены значений и при итерации - for key, value in mapping.items()), вы можете распаковать любую итерацию известной длины (если честно, в основном кортежи) в несколько переменных. Поскольку 3.x это даже практично для коллекций неизвестной длины , как вы можете указать несколько переменных , принимая отдельные элементы и один захват , что осталось: first, *everything_in_between, last = values.
  • Дескрипторы , вероятно, самый мощный из различных способов настройки доступа к атрибутам. Есть свойства (как в C #, но без специальной поддержки языка), статические методы, методы класса и т. Д., Все реализованные в виде дескрипторов. Они также первоклассные объекты. Всего неделю назад я столкнулся с повторяющимся и хитрым кодом в свойствах - поэтому я написал небольшую функцию, генерирующую повторяющуюся часть и заключающую ее в properyобъект.
  • Правило чисто офсайда (отступ для разграничения блоков). Я поставил это последнее намеренно. Хотя он и отличает Python, он не особо выделяется в повседневном программировании, когда вы к нему привыкли (или, по крайней мере, это мой опыт).
Сообщество
источник
Я все еще немного новичок в Ruby, но я думаю, что ударяет все кроме последнего пункта также? В любом случае я согласен, что «уникальный», вероятно, не будет найден в Python, но «не распространен среди других топовых языков».
Рог
@Rig: Я не эксперт по Ruby, но я не видел ни метаклассов (Ruby, конечно, столь же силен в отношении метапрограммирования, и может использовать его для схожих целей, но у меня сложилось впечатление, что это достигается по-другому), ни генераторов, ни выражений генераторов (хотя, кажется, что есть сопрограммы), ни итеративная распаковка (хотя есть многоцелевое назначение), ни дескрипторы в Ruby. Да, Ruby и Python перекрываются. Но есть и различия .
Хорошо +1. Для меня «назначение на стероидах» на самом деле является «сопоставлением с образцом бедняка», но тем не менее невероятно полезно :) Я также заметил бы, насколько гибкой является передача параметров в функциях: *argsи **kwargsбезболезненный способ сопоставления кортежей и диктов с параметрами и т. Д. .
9000
Я полагаю, что общий шут с CLOS поражает все точки, кроме использования синтаксиса на основе макета. Haskell не объектно-ориентирован (хотя есть OO-расширения), но, кроме точки метакласса, я считаю, что он соответствует всем этим функциям.
Жюль
3

Я предполагаю, что единственное, что делает Python уникальным, - это особая комбинация возможностей, которые он предоставляет. Это было бы верно для большинства языков программирования.

Или может быть одна маленькая вещь: я не видел, как Python явно передается selfв качестве формального параметра функциям-членам объекта, выполняемым на любом другом языке. Это мелочь, и я не понимаю, как это действительно что-то меняет.

Но я не очень хорошо говорю на Python, поэтому, возможно, есть вещи, которые мне не хватает наверняка!

Torbjørn
источник
@delnan: Ах, я пропустил «явно передать себя как формальный параметр» .. Думаю, это то, что я получаю за чтение в 2 часа ночи;)
Демиан Брехт
4
Явное Я происходит также в Обероне, 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 () - помочь с переводчиком / помочь с объектом
  • ключевые слова - ключевые слова Python
  • locals () - получить локальные имена
  • globals () - получить глобальные имена
  • dir () - получить свойства и методы объекта
  • метод .mro. , issubclass - понимание наследования
  • id () - получить адрес памяти объекта
Кодзиро
источник
Ruby в значительной степени обладает той же мощью, что и Common Lisp, Clojure и многие другие динамические языки, на мой взгляд.
Торбьерн
@ Торбьерн, какая сила? Автоматическая документация или функции самоанализа?
Кодзиро
Я думал об обоих. Не совсем так, но по духу. Я не верю, что у Ruby есть те же способности документирования, но, конечно, самоанализ. CL и Clojure имеют обе функции - и я считаю, что самоанализ там выходит далеко за рамки того, что вы найдете в Python, поскольку он гомоичен .
Торбьерн
1
  1. Generator Expressions
  2. input()Позвольте мне объяснить, я не видел языка (до сих пор), где вы можете назначить значение для оператора, который печатает что-то, это похоже на ruby print/gets, но со значением, назначенным для печати, вместо:print "Foo" bar = gets
  3. yield
  4. Многие типы наборов данных: ordereddict, namedtuple, array, list, tuple, dictionary
Billjk
источник
Выражения генератора могут быть реализованы в Haskell с использованием списочных представлений (списки на Haskell ленивы, в отличие от списков Python, поэтому для этого не требуется особый синтаксис). Под «вводом» я предполагаю, что вы имеете в виду функцию python 3 с таким именем (так как функция python 2 опасна и не должна использоваться). Это правда, что это необычная комбинация поведения (хотя она присутствует в javascript - window.prompt - и BASIC, где я думаю, что Python позаимствовал ее), но программист может реализовать ее тривиально ("input s =" putStrLn s >> getStrLn "сделает это для haskell).
Жюль
Ленивый язык, такой как Haskell, на самом деле не нуждается в yield - он может просто возвращать список, созданный обычными методами, и элементы будут создаваться по требованию. Несмотря на это, библиотека включает в себя явную реализацию сопрограмм. Стандартная библиотека Haskell содержит все упомянутые структуры данных и многое другое.
Жюль
-2

Дело в том, что Python входит в число очень немногих языков с чрезвычайно низкими синтаксическими издержками, что дает ему огромные выразительные возможности: списки / установки / дикты, yield, декораторы, eval, программирование мета-классов, самоанализ, оптимизированные встроенные структуры данных (списки, dicts, sets), все эти вещи сговорятся очень хорошим способом, чтобы дать вам (разработчику) возможность выразить свои мысли в кратком и элегантном коде почти так быстро, как вы только можете подумать. Я не могу думать ни о каких других языках с этим убийственным набором функций, объединенных вместе.

Rabih
источник
1
Если вы думаете, что у Python низкие синтаксические издержки (несмотря на непристойно сложную грамматику и относительно большое количество синтаксического сахара), что вы думаете о Scheme?
Тихон Джелвис
Eval действительно не должен использоваться для любой производственной программы (хотя я допускаю, что это может быть удобно для быстрых взломов). Как показано в комментариях к другим вопросам, Python отнюдь не уникален тем, что обладает этими функциями. Я полагаю, например, что у clojure есть все функции, которые вы перечислили, и большинство из них можно сделать с помощью обычного языка.
Жюль
-4

Я бы сказал, что это использование отступов для включения операторов if и циклов. Не видел этого ни на одном другом языке.

Я думаю, что это очень удобно, потому что это значительно затрудняет запутывание кода Python!

Кажется также, что он выполняется аккуратно, построчно, за исключением функций, и это тоже можно интерпретировать, что приятно.

Liang
источник
2
Википедия знает экран, полный языков, которые делают это также. Это называется правилом вне игры .
3
Я не понимаю, Это также, кажется, выполняется аккуратно, строка за строкой, за исключением функций, и это также может быть интерпретировано как таковой, что приятно. Что это означает?
Кодзиро