Как я могу научиться эффективно писать код Pythonic?


46

Выполнение в Google поиска «pythonic» открывает широкий спектр интерпретаций. На странице википедии написано:

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

Здесь также обсуждается термин «не пифонический»:

В отличие от этого, отличительной чертой непифонического кода является то, что он пытается написать код на C ++ (или Lisp, Perl или Java) на Python, то есть обеспечивает грубую транскрипцию, а не идиоматический перевод форм с другого языка. Концепция питоничности тесно связана с минималистской философией Python, заключающейся в удобочитаемости и избегании подхода «существует более одного способа сделать это». Неразборчивый код или непонятные идиомы не пифоничны.

Что означает термин «питон»? Как мне научиться эффективно применять его на практике?


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

@ Амин, это правда. На самом деле, я думаю, что вики сообщества, состоящая из того, где именно изучать языковые идиомы - для всех языков - должна быть рассмотрена.
Яти Сагаде


1
Комментаторы: пожалуйста, прекратите размещать неуместные комментарии; они были удалены по причине. Если у вас есть ответ, оставьте его как ответ. Если вы хотите обсудить тему этого вопроса, пожалуйста, используйте чат .

1
Практикуя Python!
Динамичный

Ответы:


22

Я обнаружил, что у большинства людей есть свои собственные интерпретации того, что на самом деле означает «питон». Из Википедии:

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

В отличие от этого, отличительной чертой непифонического кода является то, что он пытается написать код на C ++ (или Lisp, Perl или Java) на Python, то есть обеспечивает грубую транскрипцию, а не идиоматический перевод форм с другого языка. Концепция питоничности тесно связана с минималистской философией Python, заключающейся в удобочитаемости и избегании подхода «существует более одного способа сделать это». Неразборчивый код или непонятные идиомы не пифоничны.

Я обнаружил, что больше, чем нет, больше «питонических» примеров на самом деле происходит от людей, пытающихся быть умными с идиомами Python и (опять же, чаще, чем нет), делающих свой код практически нечитаемым (что не является Pythonic).

Пока вы придерживаетесь идиом Python и не пытаетесь использовать стили C ++ (или другого языка) в Python, значит, вы Pythonic.

Как указывает WorldEngineer, PEP8 является хорошим стандартом для подражания (и если вы используете VIM, есть плагины для линтинга PEP8).


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


Другая сторона примечание (только мое мнение, не стесняйтесь downvote из - за этого;)): Я также нашел сообщество Python быть заполнены тоннами эго (не то, что большинство общин не являются , это просто немного более распространенным в таких сообществах, как C и Python). Таким образом, объединение эго с неверно истолкованными интерпретациями «питонности» приведет к большому количеству необоснованного негатива. Возьми то, что ты читаешь у других, с долей соли. Придерживайтесь официальных стандартов и документации, и все будет в порядке.


2
+1 за хороший ответ (за исключением цитаты, так как я использовал его в ОП).

Тьфу ... Стоит ли перечитать ОП, прежде чем публиковать цитату: P
Демиан Брехт

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

17

Pythonic должен идиоматически кодировать на Python. Это означает использование структур и форматирования, которые хорошо работают для Python как с точки зрения программирования, так и с точки зрения чтения сообщества. Это очень похоже на то, как K & R давно устанавливает стандарт стиля программирования на C. Это руководство показывает, что вы должны идиоматически кодировать на Python. PEP 8 упоминается в этом руководстве, поэтому, вероятно, его стоит прочитать.


1
@ MattFenwick Разве это не 90% программирования? Хорошие программисты тратят много времени на чтение кода, а в оставшееся время пишут много кода. Чем больше кода Python вы читаете, и чем больше вы пишете на Python, тем более Python будет вашим кодом. Я не думаю, что здесь есть какие-либо ярлыки.
Крис Харпер

2
Отличная ссылка!
Итан Фурман

13

Написание "Pythonic" кода IMHO просто эффективно использует возможности (V) HLL, которые предоставляет язык. В качестве повсеместного примера

x, y = 7, 'fuhrer'

Это очень Pythonic. Я помню, когда я начал изучать C # после нескольких месяцев только Python,

int x, y = 10, z;

как-то меня смутило, но мне потребовалась минута, чтобы вернуться к корням C / C ++.

Другой способ Pythonic использует лямбды.

l = [1, 2, 3, 4, 5]
print(sorted(l, key=lambda x: -x))

будет на самом деле печатать lотсортировано в порядке убывания.

Тогда есть очень часто используемая, но очень менее понятная «печать утки» - если она ходит и говорит как утка, вы относитесь к ней как к утке. Это слабо связано с интерфейсами в других языках OO.

Также использование методов функционального программирования, где это применимо, таких как использование карты и редукции, считается питоническим.

Я видел ответ, когда я печатал, и он содержит приятную ссылку. PS: Дело не в том, что ваши знания Python ограничены. Могу поспорить, что Python не был вашим родным языком, и, следовательно, (как и большинство из нас, pythonistas), вам придется учиться, чтобы получить «идиоматические» со змеей! Ура!


Я не включил ссылку, так как она уже была опубликована во время набора текста - ответ WorldEngineer :) Подумайте только об «использовании» языковых функций для вашего и других, и вы получите Pythonic в пути, и, пожалуйста , следуйте инструкциям та ссылка
яти сагаде

4
На самом деле, многие споры , которые map, reduce, lambdaи такие идиоматических сами по себе. Понимания списков и выражения-генераторы являются альтернативой, и многие предпочитают их, когда это разумно возможно (в частности, они менее шумны, когда вам все равно понадобится лямбда). Они, безусловно, имеют свое применение, и функциональное программирование проявляется в других идиомах (например, в декораторе).

@delnan согласился - и тем более, когда дело доходит до Python 3. Вывод заключается в том, что функциональные возможности должны использоваться именно там , где это необходимо. И это (есть только один очевидный способ сделать это) идиоматично :)
Yati Sagade

Лично я никогда не понимал предпочтения людей в вашем первом примере. Это намного легче мысленно проанализировать (что является дзен Python, код читается чаще, чем пишется): (x, y) = (7, 'fuhrer')- тем не менее, я почти всегда «исправляю», что без паренов это лучший способ написать это!
Изката

2
Я бы сказал, что ваш конкретный пример сортировки не является питоническим. Зачем заново вводить порядок с лямбда-выражением, если вы можете просто print(sorted(l, reverse=True)), что дополнительно явно говорит читателю, что происходит. Я бы посчитал ваш первый пример спорным. Это два задания, сжатые в одно; все хорошо, но я бы не назвал это очень пифоническим. Читатели должны смотреть дольше на то, что они делают, по сравнению с двумя заданиями.
Френель

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

Питонический код:

  • Удобочитаемый
  • Простой (как можно проще, но не проще)
  • Хорошо продуманный

1
+1. Zen of Python более важен для написания кода Python, чем следование списку идиом; последний не охватывает все обстоятельства.
Довал

6

Каждый раз, когда я пытался выучить новый язык, я обнаружил, что чтение кода людьми, которые знают язык, как тыльная сторона ладони, ищет / спрашивает обо всем, что выглядит странно, а затем пытается имитировать их стиль. лучшее, что нужно сделать. Примеры:

В Python, поскольку мы обсуждаем эту тему, я нашел примеры из Dive Into Python невероятно полезными для начала работы. Они, как правило, учат не только основам Python, но и действительно подчеркивают идиоматический Python.

Когда я изучал D, так как документация в то время была не очень хороша, потому что язык был таким передовым, я узнал, читая код в стандартной библиотеке, в частности, некоторые из шедевров Андрея Александреску .

При изучении C ++ я унаследовал кодовую базу от довольно хорошего программиста C ++ и многое узнал о идиоматическом программировании на C ++ благодаря его настойчивости в передаче контейнеров STL по ссылке и т. Д.

На всех языках я нахожу, что просмотр вопросов StackOverflow о языке и поиск того, что обычно делают люди для выполнения основных задач, помогает.


+1 Если вы знаете основы языка, чтение кода поможет гораздо больше, чем чтение книг.
Пейс

3

Python не Java, может дать вам несколько полезных советов. Не могу сказать больше, не зная, с какими проблемами вы сталкиваетесь, но это очень конкретный совет для программистов, пришедших с другого языка (в данном случае, в частности, Java), о том, как по-другому делать Python.


2

Кто-то сказал перефразировать, чтобы узнать, что такое Pythonic, просто выбить какой-нибудь код. Я не согласен с этим. Если вам нравится писать очень плотный код, это не делает его более Pythonic.

Один из способов помочь вам определить, что такое Pythonic, в том, что касается вас, спросите себя: «Почему я (имея в виду вас) использовал язык Python?» Что вам в этом нравится?

Для меня это удобочитаемость и отсутствие компиляции и открытого исходного кода (почти все). Я могу загружать тонны библиотек и читать их исходный код с меньшим напряжением в отношении лицензирования, чем во многих других языках.

Для меня Python красив визуально. Гвидо (создатель Python) также продолжает доказывать мне своими ответами в PEPS и дискуссиях), что его выбор того, как он создал язык, превосходит мои собственные представления о том, как он должен был быть создан.

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

Упрощая синтаксис исходного кода, разрешая вводить утку вместо приведения явного типа, и ожидание того, что кодеры, проверяющие ваш код «должны быть кодерами хорошего поведения», приводит к чему-то, что я тоже называю «Pythonic»

Так что есть две стороны того, что является Pythonic. Один синтаксический, другой - практика. Как объяснить более глубокую сторону того, что является "Pythonic" ..?

В Python это не составляет большого труда сделать это: alist = ['one', 'two', 'three \ n'] alist.append ((1234, 'Atuple'))

и кортеж будет добавлен в список, не заботясь о типах объектов. Pythonic не в том, что вы МОЖЕТЕ сделать это, а в том, что ваш код должен ОЖИДАТЬ этого и просто работать / адаптироваться.

Все, что работает с объектом -alist-, должно быть написано с мыслью о том, что какой-то другой кодер может войти и добавить в список нестандартную строку и что адаптация исходного кода новым кодером не должна быть трудной для выполнения. В этом и есть преимущество дактипа.


-2

Купите рекомендованную книгу. Прочитайте это. Это должно дать вам хорошую основу для использования языка и механизма, который должен соответствовать стилю сообщества

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.