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]
[]