Python советы, трюки, идиомы


Оглавление (нажмите, чтобы открыть):

10 ценных Python-советов: для начинающих, но не только

Яр Пархоменко
Яр Пархоменко
Получайте новые статьи на e‑mail

Пишем о будущем, технологиях и стартапах

Нам нравится Python за универсальность и скорость разработки. Мы хотим, чтобы пайтонистов становилось больше, а их скиллы преумножались и прокачивались. 30 мая запускаем новый поток обучения разработчиков на Python. А пока делимся удобными приёмами, которые эксперт TechBeamers собрал из разных источников, включая вебинары по программированию на Python, Stack Overflow и Wikipedia. Прежде чем попасть в обзор, каждый из подходов прошёл экспертный отбор, то есть его удобство и эффективность проверены на практике.

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

Среди причин создания такого пособия — растущая популярность Python как языка программирования, обеспечивающего высокую скорость разработки. Оглянитесь вокруг, и вы увидите, что он эффективен везде — от различных конфигурационных инструментов до анализа XML.

Сейчас доступны разные версии Python, но большинство программистов предпочитают использовать Python версий 2.x и 3.x. Все предлагаемые советы работают в каждой из них.

1. Запуск скриптов Python

На большинстве систем UNIX можно запускать скрипты Python из командной строки следующим образом:

# run python script

2. Запуск программ на Python из интерпретатора

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

Консоль Python можно запустить с помощью команды:

# start python console

$ python
>>> type commands here>

*В этой статье весь код, идущий после >>>, нужно набирать в строке ввода Python. Важно помнить, что Python очень серьезно воспринимает табуляцию, так что если вы получаете какие-либо ошибки с её упоминанием, то исправьте выравнивание.

3. Использование функции enumerate()

Функция enumerate() добавляет счетчик в итерируемый объект, в котором используется метод __iter__ , возвращающий итератор. Он может принимать последовательные значения индекса, начиная с нуля. И выдаёт ошибку IndexError, когда индексы больше недействительны.

Типичный пример использования функции enumerate() — создание цикла по списку с отслеживанием индекса. Для этого можно использовать переменную в качестве счетчика. Но функция enumerate() позволяет сделать то же самое намного удобнее.

# First prepare a list of strings

subjects = ( ‘Python’ , ‘Coding’ , ‘Tips’ )
for i, subject in enumerate (subjects):
print (i, subject)

0 Python
1 Coding
2 Tips

4. Тип данных SET

Тип данных «set» — это своего рода коллекция. Она стала частью Python, начиная с версии 2.4. Множество содержит неупорядоченную коллекцию уникальных и неизменяемых объектов. Это один из типов данных Python, реализующих множества из мира математики. Множества, в отличие от списков или кортежей, не могут содержать дублей.

Если вы хотите создать множество, просто используйте встроенную функцию set() с последовательностью или другими итерируемыми объектами в качестве аргументов.

# *** Create a set with strings and perform search in set

# Print set.
print (objects)
print ( len (objects))

# Use of «in» keyword.
if «tips» in objects:
print ( «These are the best Python coding tips.» )

# Use of «not in» keyword.
if «Java tips» not in objects:
print ( «These are the best Python coding tips not Java tips.» )

< 'python' , 'coding' , 'tips' , 'for' , 'beginners' >
5
These are the best Python coding tips.
These are the best Python coding tips not Java tips.

Добавление объектов в множество:

# *** Lets initialize an empty set
items = set ()

# Add three strings.
items.add( «Python» )
items.add( «coding» )
items.add( «tips» )

5. Динамический ввод

В Java, C++ и других статически типизированных языках нужно указывать тип данных возвращаемого значения функции и тип каждого её аргумента. Напротив, Python, как динамически типизированный язык, не вынуждает явно указывать типы данных. На основе присвоенных значений Python отслеживает их сам.

Вот ещё одно хорошее определение динамической типизации:

«Имена связываются с объектами во время выполнения с помощью операторов присваивания. И существует возможность прикрепить имя к объекту другого типа прямо во время выполнения программы».

В следующем примере показано, как функция может проверять свои аргументы и как делать разные вещи в зависимости от типа аргументов.

# Test for dynamic typing.

from types import *

def CheckIt (x):
if type (x) == IntType:
print ( «You have entered an integer.» )
else :
print ( «Unable to recognize the input data type.» )

# Perform dynamic typing test
CheckIt( 999 )
# Output:
# You have entered an integer.

CheckIt( «999» )
# Output:
# Unable to recognize the input data type.

6. Операторы == И =

Python использует «==» для сравнения и «=» — для присваивания. Присваивание внутри операторов не поддерживается. Поэтому нет никаких шансов случайного присваивания значений, если их нужно сравнить.

7. Условные выражения

Python допускает условные выражения. В этом языке есть интуитивно понятный способ написания условных выражений. В дальнейшей практике вы сможете следовать приведенному примеру:


# make number always be odd

number = count if count % 2 else count — 1

# Call a function if the object is not None.

data = data.load() if data is not None else ‘Dummy’
print ( «Data collected is » , data)

8. Конкатенация строк

Вы можете использовать оператор ‘+’ для конкатенации строк. Делается это так:

# See how to use ‘+’ to concatenate strings.

>>> print ( ‘Python’ + ‘ Coding’ + ‘ Tips’ )

Python Coding Tips

9. Метод __init__

Метод __init__ вызывается после того, как инстанцирован объект класса. Этот метод полезен для выполнения любой запланированной вами инициализации. Метод __init__ аналогичен конструктору в C++, C# и Java.

# Implementing a Python class as InitEmployee.py

class Employee( object ):

def __init__( self , role, salary):
self .role = role
self .salary = salary

def is_contract_emp(self):
return self .salary 1250

def is_regular_emp(self):
return self .salary > 1250

emp = Employee( ‘Tester’ , 2000 )

if emp.is_contract_emp():
print ( «I’m a contract employee.» )
elif emp.is_regular_emp():
print ( «I’m a regular employee.» )

print ( «Happy reading Python coding tips!» )

Вот как будет выглядеть результат этого кода:

/src/python $:] python InitEmployee.py

I’m a regular employee.
Happy reading Python coding tips!

10. Модули

Для сохранения удобства управления своими программами по мере их роста, вы можете разбить их на несколько файлов. Python позволяет поместить множество функций в файл и использовать их в качестве модуля. Эти файлы должны иметь расширение .py. В дальнейшем модули можно импортировать в другие скрипты и программы.

# 2- Module Usage
import my_function
x,y = my_function.minmax( 25 , 6.3 )

Хотите писать код на Python быстрее и круче? — Регистрируйтесь на курс #tceh.

Топ 10 python идиом, о которых я бы хотел узнать раньше

Очередной мой перевод полезной статьи найденной pythondigest.ru. Читал как про себя, хотя я и не такой древний 😉

Далее перевод поста из блога David Taylor`a который зовет себя человеком эпохи Возрождения.

Я програмирую всю свою жизнь, но никогда не работал программистом. Большая часть моих работ были сделаны на Visual Basic, потому что он был для меня наиболее комфортным, а также на некоторых других языках (R, C, JavaScript, и т.д. . Pascal, AppleScript, гипертекст и другие, которые я узнал в 1979 году, если посмотреть достаточно далеко назад).

Пару лет назад, я решил перейти на Python исключительно, чтобы улучшить свой код. И в результате я заново начал изобретать множество велосипедов, этому я не сильно сопротивлялся, поскольку мне нравится решать головоломки.
Иногда это хорошо, для повышения питонячести ( owlman: не знаю как по другому перевести — Pythonesque ), но время от времени я ловил себя на, «ага!» в моментах, когда понимал, что делаю код грубым и избыточным без причины.

Вот список из десяти Python идиом, которые сделали бы мою жизнь намного легче, найди я их раньше. В этот список не попали некоторые идиомы, такие как списковые и лямбда-функции, которые являются очень питонячими и очень эффективными и замечательными, но их очень трудно не заметить, потому что они часто упоминаются в ответах на StackOverflow! Также не упомянуты ‘ x if y else z‘ конструкции, декораторы и генераторы, потому что я использую их не очень часто.

1. Python 3-стиль вывода в Python 2

Одна из вещей, которые заставили меня сосредоточиться на Python 2, это фиаско Python 3. Наконец, я начал с Python 2, потому что большинство библиотек, которые я хотел использовать не были совместимы c Python 3, и я решил, что если мне потребуется, то я хоть и с трудом но переведу свой код позже.

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

Да, и вот пасхальное яйцо для C программистов:

2. enumerate(list)

Это может показаться очевидным, что можно перебрать список по индексам, но я использовал переменные счетчика или срезы, выполнявшиеся длительное время.

3. Цепочки операторов сравнения

Так как я привык к статически типизированным языкам, то мне никогда не приходило в голову поставить два оператора сравнения в одном выражении. Во многих языках, «4 > 3 > 2» вернется как ложные, потому что (4 > 3) будет оцениваться как логическое, а затем (True > 2) будет оцениваться как ложное.

Мастер Йода рекомендует:  KDevelop для Windows стала доступна бета-версия установщика

4. collections.Counter

Библиотека collections — лучшее, что когда-либо было. Stackoverflow вовремя развернул меня к упорядоченным словарям, но я продолжал использовать снипет для создания словаря с нумерацией вывода результатов в своём коде. Однажды, я открыл для себя использование collections.deque.

5. Постижение Dict

Посвещение в Python программиста это постижение списков, но в конце концов я понял, что постижение Dict так же полезно — особенно для их реверсирования.

6. Выполнение shell команд с субпроцессами

Для работы с файлами я использую библиотеки операционной системы; Теперь я могу даже программным путем вызывать сложные инструменты командной строки, такие как FFmpeg для редактирования видео

(И да, я использую Windows, как и все мои клиенты. Но у меня есть хороший комплекс стесняться этого!)

Обратите внимание, что отдельный подпроцесс я бы сделал библиотекой ОС; Просто хотел чтобы все команды были знакомы. И вообще, shell=True это очень плохая идея, я использовал его здесь, так чтобы вывод команды отображался в клетки блокнота IPython. Дети, не пытайтесь повторять это дома!

7. Методы словаря .get() и .iteritems()


Имеем значение по умолчанию, если ключ не существует, также как enumerate() для списков, вы можете перебрать цепочки ключ — значение в словарях.

8. Кортеж распаковки для переключения переменных

Знаете сколько раз я использовал третью, промежуточную переменную в VB? c = a; a = b; b = c?

9. Инструменты самопроверки

Я был в курсе dir(), потому как я полагал, что help() будет делать то же самое, что и в IPython`e? Магическая команда. Она делает намного больше. (Последний раз это сообщение было обновлено после какого-то великого совета от Reddit в /r/python, который, на самом деле, я хотел бы я знать и раньше!)

10. PEP-8 совместимые цепочки кода

PEP8 руководство по стилю Python кода. Среди прочего, он рекомендует, чтобы строки кода не были более 80 символов длиной и без пробелов в конце строк.

Это может быть достигнуто с помощью комбинации обратных косых черт «\;» круглые скобки «()» с запятыми, «;» или операцией сложения «+», но каждое из этих решений неудобно для многострочных строк. Есть многострочная строка — тройная цитата, но она не влезает без пробелов.

Идиомы Python

Введение

Примеры

Словарные инициализации ключа

Предпочитают dict.get метод , если вы не уверены , что если ключ присутствует. Это позволяет вам вернуть значение по умолчанию, если ключ не найден. Традиционный метод dict[key] поднимет KeyError исключение.

Вместо того, чтобы делать

Переключение переменных

Используйте проверку истинности значения

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

Как правило, это создает более читаемый код и, как правило, намного безопаснее при работе с неожиданными типами.

Нажмите здесь для получения списка того , что будет оцениваться в False .

Проверка на «__main__», чтобы избежать неожиданного выполнения кода

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

Использование этого шаблона гарантирует, что ваш код выполняется только тогда, когда вы ожидаете, что он будет; например, когда вы запускаете файл явно:

Преимущество, однако, приходит если вы решили import файл в другой программе (например , если вы пишете его как часть библиотеки). Вы можете import файл, а __main__ ловушка будет гарантировать , что код не выполняется неожиданно:

Python: советы, трюки, идиомы

Как развернуть список, как красиво распечатать словарь, оператор деления из будущего и http сервер одной строчкой и т. п.

Экспериментальная функция:

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

Просим обратить внимание, что текст по ссылке и здесь может не совпадать.

Hi there folks. It’s been a long time since I last published a post. I have been busy. However in this post I am going to share some really informative tips and tricks which you might not have known about. So without wasting any time lets get straight to them:

Enumerate

Instead of doing:

Enumerate can also take a second argument. Here is an example:

Dict/Set comprehensions

You might know about list comprehensions but you might not be aware of dict/set comprehensions. They are simple to use and just as effective. Here is an example:

Forcing float division:

If we divide whole numbers Python gives us the result as a whole number even if the result was a float. In order to circumvent this issue we have to do something like this:

But there is another way to solve this problem which even I wasn’t aware of. You can do:

Voila! Now you don’t need to append . in order to get an accurate answer. Do note that this trick is for Python 2 only. In Python 3 there is no need to do the import as it handles this case by default.

Simple Server

Do you want to quickly and easily share files from a directory? You can simply do:

This would start up a server.

Evaluating Python expressions

We all know about eval but do we all know about literal_eval? Perhaps not. You can do:

I am sure that it’s something new for most of us but it has been a part of Python for a long time.

Profiling a script

You can easily profile a script by running it like this:

Object introspection

You can inspect objects in Python by using dir(). Here is a simple example:

Debugging scripts


You can easily set breakpoints in your script using the pdb module. Here is an example:

You can write pdb.set_trace() anywhere in your script and it will set a breakpoint there. Super convenient. You should also read more about pdb as it has a couple of other hidden gems as well.

Simplify if constructs

If you have to check for several values you can easily do:

Reversing a list/string

You can quickly reverse a list by using:

and the same can be applied to a string as well:

Pretty print

You can print dicts and lists in a beautiful way by doing:

This is more effective on dicts. Moreover, if you want to pretty print json quickly from a file then you can simply do:

Ternary Operators

Ternary operators are shortcut for an if-else statement, and are also known as a conditional operators. Here are some examples which you can use to make your code compact and more beautiful.

Thats all for today! I hope you enjoyed this article and picked up a trick or two along the way. See you in the next article. Make sure that you follow us onFacebook and Twitter!

Питонячьи хитрости

Расскажу о всяких хитростях Питона, с которыми сталкивался в работе. Долгое время записывал их на бумажку, а теперь решил скомпоновать. Думаю, будет любопытно опытным питонщикам. Сказанное ниже носит познавательный характер. Не призываю использовать в проде.

Многоточие

Неожиданно, при определенных условиях многоточие . становится правильной лексемой! Внутри оператора [] многоточие вырождается в объект Ellipsis :

Если переопределить метод __getitem__ и проверять аргументы на многоточие, можно добиться интересных результатов. Так работает библиотека hask. В ней с помощью многоточия определяются бесконечные списки:

В другом месте многоточие вызовет ошибку синтаксиса.

Срезы в аргументах

В оператор индекса [] можно передать синтаксис словаря: key: value, . . Тогда в методе __getitem__ мы получим кортеж объектов slice . Ключ и значение хранятся в полях .start и .stop . Выглядит так:

Деструктивный синтаксис

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

Это объективный минус третьего Питона. Зачем лишать разработчиков удобной возможности? Я постоянно работаю с парами. Синтаксиса def action((key, val)): теперь будет не хватать.

Погружение в словарь

Предположим, есть вложенные словари, ответ какого-то микросервиса. Нужно взять поле из глубины. Структура ответа меняется. Часто разработчики пишут следующее:

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

Неочевидный минус, из-за которого придется чинить прод в пятницу, кроется в методе .get . Он возвращает дефолт только если ключа нет. А если ключ есть и равен None , то вернется None вне зависимости от того, что передано в дефолт.

В библиотеке f я предложил нормальный способ работы со вложенными словарями:

Конечное приведение типов

Приводить типы в конце каждой операции – здравая мысль. Идея в том, чтобы добавлять к концу вычислений кусочек . or , например:

Этот прием спасает злополучного None , который лезет изо всех щелей. Беда в том, что в скриптовых языках нет четких правил для пустых значений. Например, функция может отдать или пустой список, или None . Запомнить невозможно. Рано или поздно None провалится туда, где ожидают список или число.

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

вернет ожидаемый дефолт, даже когда ключ есть и равен None . При этом если в юзере лежат актуальные данные, пустой словарь не будет создан.

Правые методы

Еще одна особенность классов в Питоне – правые волшебные методы. Они начинаются с префикса r : __radd__ , __rsub__ и т.д. Как следует из названия, эти методы вызываются для правого операнда в тех случаях, когда для левого операнда метод не определен.

Другими словами, рассмотрим выражение a + b . Сперва Питон попытается сделать так: a.__add__(b) . Если для a метод __add__ неопределен, будет предпринята другая попытка: b.__radd__(a) . И если __radd__ тоже не определен для b , вылезет ошибка.

Правые методы появились в третьей версии Питона. Попробуем реализовать следующее поведение: к списку добавляем число. Если прибавляем слева, число становится в начало списка. Если справа – в конец.

Особенности среза в тройке

Во втором Питоне у классов был особый метод __getslice__ для получения среза. В тройке его объединили с __getitem__ . Теперь интерпретатор проверяет, что передано в __getitem__ . Если написать foo[1:2] , будет передан экземпляр класса slice , а если foo[1, 2] – кортеж.

Этот пункт я привожу к тому, что переопределив метод __getitem__ , мы по запаре можем сломать операцию среза. Приходится добавлять условие: если передан срез – вызывать предка, если нет – своя логика:

OtherMedia

Информация должна принадлежать людям

Трюки и советы по Python, которые облегчат вашу жизнь

Python – это мощный язык общего назначения. Давайте погрузимся в советы по Python, а также изучение трюков, потоков и библиотек.

Введение

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

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

Изучение стандартных типов данных


1. collections.namedtuple

Когда вам не нужно добавлять методы к классу, но все же вы хотите удобства foo.prop, пробуйте использовать подобие кортежа namedtuple. Вы заранее определяете поля, а затем можете создавать легковесный класс, который занимает меньше памяти, чем полный объект.

Мастер Йода рекомендует:  5 занимательных проектов, реализованных на CSS без использования JavaScript

Вы не можете устанавливать атрибуты namedtuple, так же как вы не можете изменять членов кортежа. Вам необходимо установить атрибуты при создании экземпляра namedtuple.

2. collections.defaultdict

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

Выйдем за рамки того, что предлагает defaultdict, и установим вложенные ключи в качестве атрибутов.

С этим сниппетом будет проще писать, чем со стандартным dict. Еще легче только с defaultdict:

Кажется, что выглядит нормально, но на самом деле будет генерироваться исключение KeyError, потому что default[‘a’] – это dict, а не defaultdict. Нужно сделать defaultdict, который по умолчанию использует дефолтные словари.

Если вам нужен только счетчик по умолчанию, вы можете использовать класс collection.counter, который предоставляет некоторые удобные функции, такие как most_common.

3. Перечисление

Итерация по любому содержимому в Python проста (как и в любом другом языке) – простой цикл for:

Очень часто требуются одновременно индекс элемента, и сам элемент. Программисты используют len() и range() для перебора списка по индексу, но есть более простой способ.

Функция перечисления возвращает, как индекс, так и элемент.

Управление потоком

Управляющие конструкции – это for, while, if-elif-else и try-except. Советы по Python и правильное использование этих структур помогут в большинстве случаев.

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

1. Исключения

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

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

Сначала мы рассмотрим данные:

Теперь давайте используем советы по Python и изящно обернем commit:

Условие finally дает понять, что db.close() будет выполняться всегда. Оглядываясь назад, мы видим, что весь код, связанный с сохранением наших данных, оказался в хорошей логической группировке на том же уровне отступов. Редактируя этот код позже, нам будет легко увидеть, что все строки привязаны к commit.

2. Контекст и контроль

Ранее мы видели управление потоком с использованием исключений. В общем случае алгоритм выглядит следующим образом:

  • Попытка получить ресурс (файл, сетевое соединение, что угодно).
  • Если это не удается, очистить все, что осталось.
  • В противном случае выполнить действия на ресурсе.
  • Записать что произошло.
  • Программа завершена.

Имея это в виду, давайте рассмотрим еще некоторые советы по Python и второй пример с базами данных из последнего раздела. Мы используем связку try-except-finally, чтобы убедиться, что любая транзакция, которую мы начали, была либо закоммичена, либо отменена.

Наш предыдущий пример повторяет по шагам описанный выше алгоритм. Но как часто эта логика меняется? Не очень часто.

2.1 Менеджер контекста

Менеджер контекста упрощает защиту некоторого блока, настраивая ресурсы (контекст), необходимые блоку во время выполнения. В нашем примере нам нужна транзакция базы данных, которая будет:

  • Подключаться к БД.
  • Начинаться в начале блока.
  • Коммитить или откатывать в конце блока.
  • Очищать в конце блока.

Метод __enter __() очень простой, поэтому начнем с него.

Метод __enter __ практически ничего не делает, только возвращает подключение к базе, которое мы можем использовать внутри блока для извлечения или сохранения данных.

Метод __init__ – это то место, где выполняется соединение с БД, и, если он не работает, блок вообще запускаться не будет.

2.2 Работа методов

Теперь рассмотрим, как транзакция будет завершаться в методе __exit __. Этот метод имеет больше обязанностей, т. к. он должен обрабатывать любые исключения в блоке и закрывать транзакцию.

Теперь мы можем использовать нашу DatabaseTransaction как диспетчер контекстов для блока с действиями. В этом блоке будут запускаться методы __enter __ и __exit __, обрабатывать подключение к БД и сбрасывать его, когда мы закончим.

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

3. Генераторы

Представленные в Python 2 генераторы – это следующие советы по Python и простой способ реализовать итератор, который не хранит сразу все его значения. Обычно функция в Python начинает свое выполнение, выполняет некоторые операции и возвращает результат (или ничего).

Генераторы бывают разные.

3.1 Ключевые слова

Вместо возврата мы используем yield-слова, что делает генератор особенным. При вызове my_generator(‘thing’) вместо получения результата функции мы получаем объект генератора, который можно использовать везде, где вы могли бы использовать список или другой итератор.

Чаще всего вы можете использовать генераторы в виде части цикла, как показано ниже. Цикл будет продолжаться до тех пор, пока генератор не перестанет давать yield-значения.

После создания экземпляра генератор ничего не делает, пока у него не попросят параметр. Он выполняется до первого yield и передает это значение обратившемуся, а затем ждет, сохраняя свое состояние, пока не будет запрошено другое значение.

3.2 Генератор Фибоначчи

Теперь давайте создадим генератор, который немного полезнее, чем просто возврат трех жестко закодированных элементов. Пример классического генератора – бесконечный генератор Фибоначчи, который мы попробуем сделать. Он начнется с 1 и возвращает сумму двух предыдущих чисел столько раз, сколько вы попросите.


Нужно быть осторожными с конечным условием, когда используем генератор т. к. он “зациклится” и будет бесконечно добавлять значения.

Теперь давайте используем наш генератор, чтобы посчитать первое число Фибоначчи, которое превышает 10 000.

Это было довольно просто, и мы можем сделать это число настолько большим, насколько захотим, и код все равно найдет первое число, большее X в последовательности Фибоначчи.

3.3 Пример с API

Теперь попробуем более реальный пример. В API пагинации есть распространенная практика ограничения и предотвращения отправки более 50 мегабайт при помощи JSON на мобильное устройство. Сначала мы объявим API, с которой работаем, а потом напишем генератор.

API, которое мы используем, называется Scream – это сервис, где пользователи могут обсуждать и оставлять отзывы о ресторанах, в которых они были. Оно выглядит так:

Разработчики ввели ссылку на следующую страницу в ответе API, поэтому будет очень легко получить следующую страницу. Мы также можем покинуть эту страницу и перейти на первую. Чтобы получить данные, мы будем использовать библиотеку запросов в нашем генераторе для отображения результатов поиска.

Генератор имеет ограниченную логику и обрабатывает пагинацию примерно так:

  • Получает поисковой запрос.
  • Запрашивает API-интерфейс scream-about-food.
  • Повторяет попытку, если API не работает.
  • Получает результаты со страницы.
  • Получает следующую страницу, если есть.
  • Выходит, когда результатов больше нет.

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

После того, как генератор создан, нужно получить условия поиска, а генератор будет строить запрос и показывать результат. Код, конечно, грубый – исключения не обрабатываются вообще, а если API не отвечает или пришел неизвестный JSON-ответ, то генератор вызовет исключение.

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

Генератор обрабатывает итерации на каждой странице поискового результата. Все, что нам нужно, – использовать встроенное перечисление, описанное ранее в статье, чтобы отслеживать количество результатов и выводить их.

В качестве упражнения добавим счетчик к бесконечному поиску infinite_search:

Если вы пишете на Python 3, то уже применяли генераторы при использовании стандартной библиотеки. Вызовы вроде dict.items() теперь возвращают генераторы вместо списков. Чтобы получить это поведение в Python 2, был добавлен dict.iteritems(), но он используется не так часто.

Совместимость Python 2 и 3

Переход от Python 2 к Python 3 может быть осуществлен для любого кода, но можно писать код, который работает в обеих версиях. Поддержку Python 2.7 продлили до 2020 года, но маловероятно, что многие новые функции будут поддерживаться. На данный момент рекомендуется писать код с поддержкой Python 2.7 и 3+, если только вы не сможете полностью отказаться от поддержки Python 2.

Подробное руководство по поддержке обеих версий смотрите в гайде на python.org.

Продолжим разбирать советы по Python и рассмотрим наиболее распространенные вещи, с которыми вы могли столкнуться при попытке написать совместимый код, и разберемся, как использовать __future__ для их работы.

1. print или print()

Почти каждый разработчик, который переключился с Python 2 на 3, использовал неверный оператор печати. К счастью, вы можете стандартизировать использование print как функции (в стиле Python 3): просто импортируем print_function.

Представляем вашему вниманию статью, в которой представлены подборки полезных плюшек, если вы кодите на Python

Python: советы, трюки, идиомы | Библиотека программиста

Комментарии (36)

Антон Антонов

Чееее? Как это работает? for file_name in file_list: if is_build_file(file_name): break else: # никаких break make_built_file()

Александр Иулин

Антон, А что тебя смущает

Кирилл Кулиев

вот так: бжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж

Антон Антонов

Alexander, а в принципе, ничего. Попутал, попутал. Непривычен питон после плюсов.

Вася Бочкин

Евгений Мартынов

Anton, ну вот оно на плюсах: for (auto file_name : file_list) if is_build_file(file_name) break; else //никаких break make_built_file(); И всё же какой момент ввёл в заблуждение?

Вася Бочкин

Дмитрий, я js c php изучаю, они очень похожи друг на друга. Ну и мне пока там все очень понятно. В питоне слишком много что устанавливать нужно и постоянно нужно следить за новыми обновлениями. Меня это напригает

Александр Иулин

Антон, Ты прав после с/с++ непревычно, да Python своеобразен, после освоения окозался очень годным языком для многих задачь. Но первый язык для изучения я всетаки считаю должен быть с/с++

Антон Антонов

Evgeny, не встречал такого на плюсах. Просто подумал, что for в том коде выполняется бесконечно до брейк, и, мол, если не попадает на него, включается элс. А вот как он должен включиться. Не знаю, почему так подумал. Все-таки, и там, и там фор. Только в питоне типа fiteach

Евгений Мартынов

Dmitry, >Ибо отступ >Питонисты сатанисты ————— Язык хорош, но когда задача сводиться к решению её путём игры в строительство ступеньки, лично меня такие обстоятельства люто выбешивают. На любителя он в общем. =)

Constantine Borodin

Evgeny, почему никто всерьез на паблике не обсуждает концепты типа кортежей в питоне и классы друзья в С++

Constantine Borodin

Антон, в С++ есть итераторы тож, а недавно еще и в стандарт вошел форич по оператору. главное отличие насколько я понял от классического for что форич можно директивно распараллелить

Вася Бочкин


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

Constantine Borodin

Дмитрий, так goto тоже моветон, но он реально иногда нужен.

Евгений Мартынов

Constantine, на самом деле это не повседневные вещи и, как видишь, спустя 20 лет они с неиллюзорным скрипом попадают в новые стандарты. Причин этому много. Первая из них — это то, что всё, что написано на плюсах — это лютый легаси C++03 код, недалеко ушедший от обычного Си, но с классами. В большинстве случаев людям просто приходится соблюдать корпоративную этику и не юзать новомодные штуки в старых проектах. Вторая вещь — это то, что все эти фичи юзаются не в ежедневном программировании, а в разработке гипотетических фреймворков и наборов библиотек. Подразумевается, что используя все эти вещи легко будет разрабатывать большие проекты, части из которых могут стать универсальными (утилизируемыми) и будут использоваться многократно. Легко предание, да верится с трудом. Люди всё равно продолжают строить свои велосипеды, не особо вникая в кортежи, в ренджы, лямбды, замыкания, авто-выведение типа и выполнение на этапе компиляции. Всем проще унаследовать класс от QObject и насладиться слот-сигнальной парадигмой из Qt, далеко не суясь в дебри.

Мастер Йода рекомендует:  CISCO желает купить Skype за пять миллиардов долларов

Constantine Borodin

Дмитрий, смотри у тебя есть выбор. Или один раз класс друзья приделать, или переписать 50 классов.

Евгений Мартынов

Dmitry, >C++ устарел —————- Толсто :3

Constantine Borodin

Дмитрий, это ООПухоль гловного мозга. Мне кажется все-таки главное это баланс поддерживаемости, производительности, и текущих трудозатрат. Строгое следование парадигме ведет к перекосу этого баланса

Constantine Borodin

Евгений, ну в питоне есть такие концепты которых нет в С++ и наоборот. Дело не в синтаксисе, в конце-концов для оного можно просто синтаксический конвертер написать как MS поступил в свое время. Я к тому что синтаксис не та причина по которой следует обсуждать преимущества того или иного языка.

Евгений Мартынов

Constantine, >недавно еще и в стандарт вошел форич по оператору ———— Вот тут не понял. for_each был с C++98. Какой-то новый что ли придумали? Подробнее можно?

Евгений Мартынов

Constantine, я говорю, что for_each был и ранее в плюсах. Новую версию какую-то изобрели?

Constantine Borodin

Евгений, ну я не из STL имел ввиду а самый обычный for который теперь может по набору значений выполняться. Это появилось в С++11

Constantine Borodin

Дмитрий, В boost асинки есть давно.

Constantine Borodin

Дмитрий, а причему тут С++, вы с библиотекой не разобрались, хотя неисключено что и фреймворк кривоват.Можно было альтернативы искать. С++ незаставляет все делать средствами исключительно фреймворка Qt, в этом и гибкость языка.

Constantine Borodin

Дмитрий, а как это к языку относится, вы также либы питона уже используете, как можно было применить boost в этом случае. http://www.boost.org/doc/libs/1_63_0/libs/fiber/doc/html/fiber/synchronization/channels/unbuffered_channel.html

Constantine Borodin

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

Constantine Borodin

Дмитрий, 1.6 был кажется в 2012

Антон Антонов

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

Constantine Borodin

Дмитрий, в принципе Вы правы, большинству это и не надо на практике. Важно просто чтобы сохранялось понимание что КОМПЬЮТЕР делает (хотя бы в общих чертах) когда я пишу тот или иной набор букв, иначе программирование превратится в набор магических услуг.

Антон Антонов

Dmitry, большинство задач, которые требуются на работах — это полнейшая хрень, типа написать интернет-магазин, сайтец, бэк-енд, фронт-енд и бла-бла-бла. Потому, если верить гуглу, на первых местах по востребованности, https://vc.ru/p/what-language-2020 скрипты, SQL, ява, пхп, шарпы. Вот эти ребята, например, которые занимаются далеко не фигней, пишут проги на плюсах. http://rfdyn.ru/about/ Не пишут фигню на плюсах — закономерно и правильно. А на чем будут писать сложные вычислительные задачи, которых много? Мешать плюсы с другим языком — тоже неплохо, только это не отменяет необходимости плюсов.

Владимир Смоленцев

Антон, думаю вы за бла-бла-бла скрыли огромный мир вебтехнологий который уже соперничает в бухгалтерии , логистике, управлении персоналом, играми и документообороте с десктопными приложениями! Не обобщайте и необобщенными будете! Язык это всего лишь инструмент, если человекочасов будет потрачено на плюсах в 2 раза больше чем на другом языке для решения той же задачи . никто не будет выбирать С++! Ниша в iT области по этой причине у С++ сокращается, можно быть недовольным а можно изучить пару новых языков! Все в Ваших руках ! Во вторых рейтинг ваш перевран , если вам нужен Tiobe рейтинг то и берите https://www.tiobe.com/tiobe-index/

Александр Жуков

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

Владимир Смоленцев

Александр, я не спорю , просто обьсняю что словом хрень описывать все работы которые написаны не на Си и ассемблере глупо! Для человека я тут вычислил 3 в 388-й степени умноженной на 2 =4975418981526854860240196972955208070003714552517205739357408887258712057770118976672023098897556123686015108720902536145878675458237580133506232020200451880933613421615271700444695739429079959108877185304064300801514929467704202114859659578595127867403930739726443177720751896812774685496472301741552255926171554561197131159351334948970395196902596540669233038509912641937096911750111552420753914688964759685796434369437445791161711831594347564492067289246306185517876322 , чтобы не беспокоился , вычисления в надежных руках!

Александр Жуков

Владимир, Я полиглот, использую языки под задачи, поэтому не критикую языки на которых пишут другие)

Владимир Смоленцев

Александр, я сам всю жизнь программировал на С++(TurboC,Borland C,MSVC) . , поэтому знаю все его достоинства и недостатки!

Антон Антонов

Vladimir, мир веб-технологий соперничают в бухгалтерии, в логистике и т.д. с чем? С чем соперничают? Я, собственно, и сказал: Не пишут фигню на плюсах — закономерно и правильно. Я выделю этот момент, я не отрицаю, что языки «более высокого уровня» полезны во многих вещах, но плюсы тоже не лишние. Не все же в Интернетике сидеть. А фигней я все это назвал потому, что для этого высшее образование как-то не особо нужно. Ну, блин, серьезно же. Берешь, открываешь пару курсов, пару книг, читаешь такой за месяц-два. Ну за год, если ты ленивый, и идешь работать. Сначала джуниором или стажером за копейки, лет через 5-10 ты мегапрофи — ремесленник 21 века. (вот с машинным обучением так вряд ли получится, например. Ну, если прям шарить-шарить. Нет, ну получится, но если ты прям очень трудолюбивый и принципиально не идешь в универ, потому что религия запрещает) Да и само по себе не сильно оно сложнее, чем в фотошопе рисовать. Я, конечно, не говорю опять же про какие-нибудь сервера фейсбука, которые собирают информацию, потом шифруют и отправляют ЦРУ. Я говорю про интернет-магазины. Про тупые интернет магазины. Это которых большинство.

Идиомы Python

Введение


Примеры

Словарные инициализации ключа

Предпочитают dict.get метод , если вы не уверены , что если ключ присутствует. Это позволяет вам вернуть значение по умолчанию, если ключ не найден. Традиционный метод dict[key] поднимет KeyError исключение.

Вместо того, чтобы делать

Переключение переменных

Используйте проверку истинности значения

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

Как правило, это создает более читаемый код и, как правило, намного безопаснее при работе с неожиданными типами.

Нажмите здесь для получения списка того , что будет оцениваться в False .

Проверка на «__main__», чтобы избежать неожиданного выполнения кода

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

Использование этого шаблона гарантирует, что ваш код выполняется только тогда, когда вы ожидаете, что он будет; например, когда вы запускаете файл явно:

Преимущество, однако, приходит если вы решили import файл в другой программе (например , если вы пишете его как часть библиотеки). Вы можете import файл, а __main__ ловушка будет гарантировать , что код не выполняется неожиданно:

Каковы важные языковые функции (идиомы) Python для изучения на раннем этапе

Мне было бы интересно узнать, что сообщество StackOverflow считает важными языковыми функциями (идиомами) Python. Функции, которые определяли бы программиста как Pythonic.

Python (pythonic) idiom — «выражение кода», которое является естественным или характерным для языка Python.

Плюс, какие идиомы должны начинать программисты на Python раньше?

12 ответов

24 Решение gahooa [2009-02-20 00:48:00]

Python — это язык, который можно охарактеризовать как:

«, которые вы можете поместить в ладони с огромным сумкой Крючки».

Почти все в python следует тем же простым стандартам. Все доступно, сменное и настраиваемое. Очень мало элементов уровня языка.

Возьмем, например, встроенную функцию len (data). len(data) работает, просто проверяя метод data.__len__() , а затем вызывает его и возвращает значение. Таким образом, len() может работать с любым объектом, реализующим метод __len__() .

Начните с изучения типов и базового синтаксиса:

  • Динамические сильно типизированные языки
  • bool, int, float, string, list, tuple, dict, set
  • отступы, «все — объект»
  • определения основных функций

Затем перейдем к изучению того, как работает python:

  • импорт и модули (действительно простые)
  • путь python (sys.path)
  • функция dir()
  • __builtins__

Как только вы поймете, как скомпоновать части, вернитесь и рассмотрите некоторые из более продвинутых функций языка:

  • итераторы
  • переопределяет, как __len__ (их много)
  • список понятий и генераторов
  • классы и объекты (опять же, действительно простые, как только вы знаете пару правил)
  • правила наследования python

И как только у вас будет уровень комфорта с этими элементами (с акцентом на то, что делает их pythonic), посмотрите на более конкретные предметы:

  • Threading in python (обратите внимание на блокировку Global Interpreter)
  • контекстные менеджеры
  • доступ к базе данных
  • файл IO
  • розетки
  • и т.д.

И никогда не забывайте Дзен Питона (Тим Петерс)

�� Python Tricks ��

Get a short & sweet Python Trick delivered to your inbox every couple of days:

Get a short & sweet Python Trick delivered to your inbox every couple of days. No spam ever. Unsubscribe any time. Curated by the Real Python team.

Q: What’s a Python Trick?

A short Python code snippet meant as a teaching tool. A Python Trick either teaches an aspect of Python with a simple illustration, or serves as a motivating example to dig deeper and develop an intuitive understanding.

Here are a few examples of the kinds of tricks you’ll receive:

Improve Your Python Skills, Bit by Bit:

Get a short & sweet Python Trick delivered to your inbox every couple of days. No spam ever. Unsubscribe any time. Curated by the Real Python team.

What Python Devs Are Saying:

The PyTricks newsletter by @realpython is a fantastic example of how newsletter should look like. Short, clear and straight to the point!

love the work you’ve done, are doing, and continue to do!

These are so good. The «dicts to emulate switch/case statements» was ������. https://t.co/U2J7IOPmJN

The regular emails from @realpython are a real treat and highly recommended for anyone interested in Python.

Добавить комментарий