Тъй като не е необходимо да се напише в питон, Част 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, но това е мястото, където тя понякога играе с нови цветове. Проблеми, всъщност, две:
- Обработка на изключенията през прохода.
- Обработка на всички изпълнени в един eksepshenov освен блок.
Използването пас
Проблемът е не само Python, но други езици. Понякога можете да видите неща, като например:
Много ли е зле? Изключение - ситуацията е извънредна ситуация, която винаги трябва да се работи изрично. Методът на лечението зависи от характеристиките на кода: някои моменти, необходими от сеч, някои изход за потребителя като грешка, а в някои просто падат. Но това е тема за отделен пост.
Какво е по-лошо по-горе подход? Съществува опасност за дълго време да се копае, за да разберете това, което е в приложението се е объркало. Нещо повече - за да се определи, че нещо се е объркало само с косвени доказателства, че доклад само факта на грешка (в най-добрия), но не казва нищо за мястото и причината за възникването му. Този пример последователно ще раздаде празен речника като стойност на променливата parsed_json независимо от това какво може да се търси JSON променлива raw_json (ако си представим, че някъде над него е обявена).
Веселбата започва, освен ако не сте посочили точно това, което трябва да се справят с грешки.
Работете с всички изключения в блок
Ако въведете кода на проба в интерпретатора в секцията по-горе - че ще работи без никакви грешки. Докато е в добро, което не не трябва да импортирате JSON модул, и линията <много кода> - обща синтактична грешка. Това е същата комбо, което води до много неправомерно часове за отстраняване на грешки. Проблемите са могли да бъдат избегнати, ако само необходимите прихванатите изключения:
Сега NameError и SyntaxError изключения ще бъдат успешно уловени и ValueError и Тип грешка успешно обработени. Бих искал да отбележа, че изключенията по SyntaxError е обичайната - CPython преводач проверява синтаксиса е вярна само по време на изпълнение.
Обобщение заключение: той винаги е необходимо да се уточнят ясно колко и какви изключения трябва да бъдат обработени.