Тъй като не е необходимо да се напише в питон, Част 1 - дневник

Въпреки че един от постулатите на начина, по който Python е фразата "Не трябва да има един - и за предпочитане само един - очевиден начин да го направя" - в действителност това не е така. На езика на много начини да се направи нещо очевиден начин за начинаещ, но търси опитни ужасни Pythonistas (и обратно). Най-лошото нещо, че въпреки всички усилия на Гуидо и компанията, този процес може да бъде дори по повече от един.

В Python, като на всеки език, можете да напишете или идиоматичен или лошо. Разбира се, дори и написани в пълно съответствие с най-добрите практики може да реализира сложен алгоритъм, който не е много добро. Но, независимо от тъжните, това, което би могло да бъде по-добре от добър алгоритъм правилно и idiomatically приложени?

Сега за това, как да пишат и как не.

Python всички стандартни структури от данни са итератори и не изискват изрично индекси индикация. Но първо, старите навици често преобладават и настояват да напиша нещо подобно:

В действителност, индексът тук - това е допълнително лице, което е лишено от смисъл. Правилно пише:

Но за да получите на индекса в последователността може да бъде по-елегантен начин (ако имате нужда от него):

Но това се случва, имате нужда от малко по-често от всякога.

Накратко: ако можете да направите, без индекси - трябва да направите, без тях.

Цикли на мястото, и не много

Ние сме дошли от други езици (C, C ++, Perl, Java) е навик да използват цикли когато това се налага заобикаляйки събирането, въпреки че в Python тях в повечето случаи могат да бъдат заменени с други инструменти: изрази генератори или функции по-висок ред.

Тривиална задача: трябва да изберете от списък с потребители, които са is_paid набор собственост на True. Лошо решение:

Как да го пиша правилно:

Сега ние не разполагат с допълнително нивото на влагане и код се чете като едно изречение, а не като последователност от действия. В допълнение, не можете да се върнете в списъка, и генератора (мързеливи, за да направи изчисление), просто промяна на квадратен скобите в кръг:

Ако всичко това изглежда странно и непонятно - че е време да се върнем към четенето Lutz :)

Сега за функциите на по-висок ред. Да предположим, че имаме една проста задача: има променлива записи, представляващи итератор за обекти от стойността на имота. Необходимо е да се изчисли сумата от стойностите в тази област във всички обекти.

Колко често те пишат:

Три линии, които не миришат и декларативни. Но тъй като е било необходимо да го напиша:

Ако трябва да се изпълнява от списък на някои друга функция - леко се използва за намаляване. Внимателно защото намалява в някои случаи не работи толкова бързо, колкото бихме искали (това ще бъде по-ниска).

И, можете да използвате функцията и филтъра на картата като алтернативен израз генератори. Но това е един аматьор.

С една дума: не използвайте електрически вериги, където можете да използвате инструменти за по-високо ниво, като функции за работа със списъци, функции от висок порядък (карта, филтър, намаляване) на експресия или генератори.

Велосипеди вместо стандартните средства за език

Пример за това е една много банална операция на низове.

Когато човек е пропита с функционалната парадигма, ръцете му се протягат към бутам някои техники, където им неща не си струва повече от определен език. Например, в една и съща низове.

Ако се вгледате в това, което се случва: на всяка стъпка, нова линия, която ще обедини всички предишни и го допълва с нов фрагмент от начина - като следствие от това паметта изтичане тона.

Между другото, някои от тези, чиито мозък е доста празна по отношение на всяка funktsionalschine пиша няма по-добър (пример за действителният код):

Същото се намали, само разбрах, ръцете си, с всичките му недостатъци, излишната path_part вещество и допълнително ниво на гнездене. Ето един по-добър начин:

Тя работи бързо и изисква само линейна памет, за да работи.

Python има много вградени функции, които правят живота по-лесен. Например, не е запознат с вградените функции може да бъде на път да напише такова прекрасно код:

Въпреки че можете да напишете банална и по-бързо вземане на решение (това наистина е по-бързо, се дължи на факта, че сумата всъщност - sishny подвързване):

Да се ​​върнем към предишния пример за поставянето на пътя до файла. в този пример кодът е свързан с UNIX-платформа за използване наклонени черти "/". В реалния код, разбира се, правилно да се използва вградената платформено независима функция на модула за Операционна система:

Накратко: това не е необходимо, за да преоткрие отново велосипедите си, където на езика вече има готово решение. И решения изобилстват:

  • мин и макс функции.
  • Определете (най-лесният начин prounikalit елементи в несортиран списък, наред с други неща).
  • всеки и всички функции.
  • Интересни типове данни в модула за колекции. Трябва да се обърне специално внимание за defaultdict и namedtuple.
  • Всеки стандартни типове данни има много техники, които могат значително да улеснят живота.
  • Всички стандартната библиотека.

Накратко: ако можете да използвате стандартни езикови средства - трябва да ги използваме.

Странни изрази в ако е

Хората, които идват от други PL понякога пишат нещо като това:

Някой, който е прочел за оператора е да го напиша по този начин:

Или още по-интересно за структури от данни:

Някой може да си спомни, че изразът в ако е необходимо изрично да се сравняваме с Вярно или невярно, но не забравяйте, че стойността на израза е имплицитно хвърли да въведете булев:

Горните примери трябва да се пренаписва като:

Правила за привеждане булев прост и описани в стандартната документация. С една дума, една лъжа, когато типовото кастинг за връщане:

  • никой
  • фалшив
  • Броят 0 във всичките му форми (0, 0.0, 0j).
  • Празен стандартната структура на данни (<>, () "," []).
  • Копия потребителски класове, които дефинират методите Булева () или лен (), и ако тези методи се върнат 0 или невярно.

Накратко: ако имате нужда да пиша инструкции като ако <выражение>: Без никакви сравнения с Вярно или невярно и изрични отливки

Неправилното боравене с изключения

В действителност, такъв проблем съм виждал не само в Python, но това е мястото, където тя понякога играе с нови цветове. Проблеми, всъщност, две:

  1. Обработка на изключенията през прохода.
  2. Обработка на всички изпълнени в един eksepshenov освен блок.

Използването пас

Проблемът е не само Python, но други езици. Понякога можете да видите неща, като например:

Много ли е зле? Изключение - ситуацията е извънредна ситуация, която винаги трябва да се работи изрично. Методът на лечението зависи от характеристиките на кода: някои моменти, необходими от сеч, някои изход за потребителя като грешка, а в някои просто падат. Но това е тема за отделен пост.

Какво е по-лошо по-горе подход? Съществува опасност за дълго време да се копае, за да разберете това, което е в приложението се е объркало. Нещо повече - за да се определи, че нещо се е объркало само с косвени доказателства, че доклад само факта на грешка (в най-добрия), но не казва нищо за мястото и причината за възникването му. Този пример последователно ще раздаде празен речника като стойност на променливата parsed_json независимо от това какво може да се търси JSON променлива raw_json (ако си представим, че някъде над него е обявена).

Веселбата започва, освен ако не сте посочили точно това, което трябва да се справят с грешки.

Работете с всички изключения в блок

Ако въведете кода на проба в интерпретатора в секцията по-горе - че ще работи без никакви грешки. Докато е в добро, което не не трябва да импортирате JSON модул, и линията <много кода> - обща синтактична грешка. Това е същата комбо, което води до много неправомерно часове за отстраняване на грешки. Проблемите са могли да бъдат избегнати, ако само необходимите прихванатите изключения:

Сега NameError и SyntaxError изключения ще бъдат успешно уловени и ValueError и Тип грешка успешно обработени. Бих искал да отбележа, че изключенията по SyntaxError е обичайната - CPython преводач проверява синтаксиса е вярна само по време на изпълнение.

Обобщение заключение: той винаги е необходимо да се уточнят ясно колко и какви изключения трябва да бъдат обработени.