14. Генераторы и генераторные выражения.
- Генератор - простой механизм создания итераторов.
- Выглядит как обычная функция, но вместо return используется ключевое слово yield.
__iter__и next() создаются для генератора автоматически.- При каждом вызове next() генератор продолжает выполняться с момента остановки (первый раз - начало функции, остальные - последний yield).
- Промежуточное состояние сохраняется автоматически между вызовами.
- После окончания выполнения (внутри функции дошли до конца) автоматически выбрасывается StopIteration.
def counter(): val = 1 for ind in xrange(10): yield val val = val + 1 print type(counter), type(counter()) print [val for val in counter()]
<type 'function'> <type 'generator'> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Генераторные выражения
- Записываются полностью как list comprehensions, только вместо квадратных скобок - круглые.
- Генераторное выражение возвращает генератор.
- Используется более короткая, но и более ограниченная форма записи.
gen = (val for val in [1, 2, 3]) print gen print [val for val in gen] print [val for val in gen]
<generator object <genexpr> at 0x7f4d1c6664b0> [1, 2, 3] []