Як я можу навчитися ефективно писати пітонічний код?


46

Здійснення пошуку в Google за "пітонічним" виявляє широкий спектр тлумачень. На сторінці вікіпедії написано:

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

Тут також обговорюється термін "непітонічний":

На відміну від непітонічного коду є те, що він намагається записати C ++ (або Lisp, Perl, або Java) код на Python, тобто забезпечує грубу транскрипцію, а не ідіоматичний переклад форм з іншої мови. Концепція пітонічності тісно пов'язана з мінімалістичною філософією читабельності Python та уникненням підходу "існує більше ніж один спосіб зробити це". Нечитабельний код або незрозумілі ідіоми непітонічні.

Що означає термін "пітонічний"? Як навчитися ефективно його застосовувати на практиці?


6
Я думаю, що ваше питання можна поширити на будь-яку мову програмування. Завжди є рекомендований спосіб програмування, який може бути точним у великій кількості випадків, а також покращити перегляд, читабельність та обслуговування. Думаю, що також складні ці рекомендації можуть змусити мову розвиватися та просуватися ...
Амін

@Amine так правда. Насправді я думаю, що слід розглянути вікі спільноти, що складається саме з того, де вивчити мовні ідіоми - для всіх мов.
yati sagade


1
Коментатори : будь ласка, припиніть публікувати невідповідні коментарі; їх видалено з причини. Якщо у вас є відповідь, залиште її як відповідь. Якщо ви хочете обговорити тему цього питання, скористайтеся чатом .

1
Практикуючи Python!
Динамічний

Відповіді:


22

Я виявив, що у більшості людей є власні інтерпретації того, що насправді означає "піфонічне". З Вікіпедії:

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

На відміну від непітонічного коду є те, що він намагається записати C ++ (або Lisp, Perl, або Java) код на Python, тобто забезпечує грубу транскрипцію, а не ідіоматичний переклад форм з іншої мови. Концепція пітонічності тісно пов'язана з мінімалістичною філософією читабельності Python та уникненням підходу "існує більше ніж один спосіб зробити це". Нечитабельний код або незрозумілі ідіоми непітонічні.

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

Поки ви дотримуєтесь ідіом Python і уникаєте спроб використовувати стилі C ++ (або іншої мови) у Python, значить, ви є пітонічним.

Як вказує WorldEngineer, PEP8 - це хороший стандарт, якого слід дотримуватися (і якщо ви використовуєте VIM, для підв’язки PEP8 доступні плагіни).


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


Ще одна сторона (просто, на мою думку, не соромтеся зголоситися через це;)): Я також виявив, що спільнота Python наповниться тоною его (не те, що більшість громад не є , це просто трохи більше поширене у спільнотах, таких як C і Python). Таким чином, поєднання его з помилковим тлумаченням того, що воно є "пітонічним", як правило, призведе до безлічі необґрунтованих негативів. Візьміть те, що читаєте від інших, із зерном солі. Дотримуйтесь офіційних стандартів та документації, і ви будете добре.


2
+1 за гарну відповідь (за винятком цитати, оскільки я використовував її в ОП).

Тьфу .. Якщо слід перечитати ОП перед публікацією цитати: P
Demian Brecht

3
Скоріше, існує велика кореляція між его та активним в Інтернеті, озвучуючи думку в будь-якій спільноті. В основному ви не бачите настільки неегоїстичних людей, тому що вони не так багато пишуть.
isarandi

17

Pythonic - це ідіоматичне кодування в Python. Це означає використання структур і форматування, які добре працюють для Python з точки зору програмування, але і з точки зору читання спільноти. Це дуже схоже на те, як K&R тривалий час встановлював стандарт стилю програмування на C. Це керівництво показує, що ви повинні ідіоматично кодувати в Python. У цьому посібнику посилається на PEP 8, тому, ймовірно, варто прочитати.


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

2
Відмінне посилання!
Етан Фурман

13

Написання «пітонічного» коду IMHO просто ефективно використовує функції (V) HLL, які надає мова. Як всюдисущий приклад,

x, y = 7, 'fuhrer'

Це дуже піфонічно. Я пам’ятаю, коли я почав вивчати C # через кілька місяців лише Python,

int x, y = 10, z;

якимось чином заплутав мене, але мені знадобилося хвилину, щоб повернутися до своїх коренів C / C ++.

Ще один пітонічний спосіб - використання лямбда.

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

насправді буде надруковано lвідсортовано у порядку зменшення.

Тоді є дуже використовуване, але дуже менш зрозуміле «набирання качки» - Якщо вона ходить і розмовляє, як качка, ви ставитесь до неї як до качки. Це слабко пов’язано з інтерфейсами інших мов ОО.

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

Я побачив відповідь, розміщену під час набору тексту, і вона містить приємне посилання. PS: Справа не в тому, що ваші знання Python обмежені. Я можу обзавестись, що Python не був вашою першою мовою, а значить, (як і більшість з нас пітоністів) вам доведеться навчитися отримувати «змісту» зі змією! Ура!


Я не включив посилання, оскільки воно вже було опубліковано, коли я друкував - відповідь WorldEngineer :) Просто подумайте про "використання" мовних особливостей для вашого та чужих благ, і ви отримаєте Pythonic в дорозі, і, будь ласка , дотримуйтесь що посилання
yati sagade

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

@delnan погодився - і тим більше, якщо мова йде про Python 3. Висновок - функціональні функції слід використовувати саме там , де це потрібно. І це (є лише один очевидний спосіб зробити це) ідіоматично :)
yati sagade

Особисто я ніколи не розумів уподобань людей до вашого першого прикладу. Це подумки проаналізувати набагато простіше (Що таке дзен Python, код читається частіше, ніж написано): (x, y) = (7, 'fuhrer')- але я майже завжди "виправлений", що без паронів це найкращий спосіб написати це!
Ізката

2
Я б заперечував, що ваш конкретний приклад сортування не є пітонічним. Навіщо повторно вводити перепорядкування з лямбда, якщо ви просто можете print(sorted(l, reverse=True)), що додатково чітко повідомляє читачеві, що відбувається. Я також вважаю ваш перший приклад спірним. Це два завдання, стислі в одне; це добре, але я б не назвав це дуже пітонічним. Читачі повинні довше дивитися на те, що він робить, ніж порівняно з двома завданнями.
phresnel

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. Дзен Пітона важливіший для написання пітонічного коду, ніж дотримання списку ідіом; останні не охоплюватимуть усіх обставин.
Доваль

6

Щоразу, коли я намагався вивчити нову мову, я виявив, що читання коду людьми, які знають мову, як тильна сторона руки, дивлячись / запитуючи про все, що виглядає дивно, а потім намагаються наслідувати їх стиль найкраще робити. Приклади:

У Python, оскільки ми з цього питання, я знайшов приклади з Dive Into Python неймовірно корисними для початку роботи. Вони, як правило, навчають не тільки основ Python, а й справді підкреслюють ідіоматичний Python.

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

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

На всіх мовах я вважаю, що перегляд питань StackOverflow про мову та перегляд того, що люди зазвичай роблять для досягнення основних речей, допомагає.


+1 Коли ви дізнаєтесь основи мови, читання коду допоможе набагато більше, ніж читання книг.
Темп

3

Python - це не Java, може дати вам корисну пораду. Не можу сказати більше, не знаючи, з якими проблемами ви стикаєтесь, але це дуже конкретна порада для програмістів, які надходять з іншої мови (в даному випадку конкретно на java), як зробити python по-іншому.


2

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

Один із способів допомогти вам визначити, що таке Pythonic, що стосується вас самих, запитайте себе: "Чому я (маю на увазі вас) використовувати мову Python?" Що до вас звертається?

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

Для мене Python візуально красивий. Гвідо (творець Python) також постійно доводить мені своїми відповідями в PEPS та дискусіях), що його вибір того, як він зробив мову, перевершує мої власні уявлення про те, як вона мала бути створена.

Для мене чудовим програмістом є той, хто має дуже обізнані навички прийняття рішень про те, яким шляхом слід пройти кодування. Мені Python допомагає робити цей вибір швидко.

Спрощення синтаксису вихідного коду, дозволяючи вводити качок замість кастингу типу explicid, і сподівання, що кодери, що переглядають ваш код, "повинні добре поводитися з кодерами", призводять до того, що я занадто називаю "Pythonic"

Отже, є дві сторони того, що є пітонічним. Одне є синтаксичним, інше - практикою. Як пояснити глибшу сторону того, що таке "піфонічне" ..?

У Python робити це не так: alist = ['one', 'two', 'three \ n'] alist.append ((1234, 'Atuple'))

і кортеж буде доданий до списку, не турбуючись про типи об’єктів. Пітонічна частина полягає не в тому, що ви МОЖЕТЕ це зробити, а в тому, що ваш код повинен цього очікувати і просто працювати / адаптувати.

Що б не працювало на -alist- об'єкті, слід писати з думкою про те, що якийсь інший кодер міг би увійти і додати до списку не рядок, а адаптація вихідного коду новим кодером робити не складно. Оце і користь каченяти.


-2

Купіть рекомендовану книгу. Читати. Це має дати вам гарну основу використання мови та механізму, який повинен відповідати стилю спільноти

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