Generator (генератор)
Функция, возвращающая подвид итератора, генерирующий значения.
На заметку
Словом «генератор» обычно обозначается функция-генератор (или метод-генератор), возвращающая итератор генератора. Однако иногда слово может быть использовано и для обозначения самого итератора. В случаях, когда контекст непонятен лучше использовать полные термины: функция-генератор и итератор генератора. Итератор генератора — это объект, порождаемый функцией-генератором.
На заметку
Генераторы являются простым средством для создания итераторов. Всё, что можно сделать при помощи генераторов можно также сделать при помощи итераторов, построенных на классах. Но в случае генераторов методы __iter__() и __next__() создаются автоматически, также автоматически возбуждается StopIteration, да и поддерживать генераторы проще и удобнее, чем реализовывать то же с использованием классов.
Выглядят функции-генераторы также как и обычные, но содержат выражения с ключевым словом
yield
для последовательного генерирования значений, которые могут быть использованы в циклах for in, либо их получения при помощи функции next().На каждой
yield
работа функции временно приостанавливается, при этом сохраняется состояние исполнения, включая локальные переменные, указатель на текущую инструкцию, внутренний стек и состояние обработки исключения. При последующем обращении к итератору генератора (при вызовах его методов) функция продолжает своё исполнение с места, на котором была приостановлена. Этим функции-генераторы отличаются от обычных функций, при вызове которых исполнение всякий раз начинается с начала.Если функция достигает инструкции
return
, либо конца (без указания упомянутой инструкции), возбуждается исключение StopIteration и итератор исчерпывает себя. def my_animal_generator():
yield 'корова'
for animal in ['кот', 'собака', 'медведь']:
yield animal
yield 'кит'
for animal in my_animal_generator():
print(animal)
# корова кот собака медведь кит
На заметку
Функции-генераторы весьма похожи на сопрограммы: могут выдывать значения несколько раз, имеют более одной точки входа, их выполнение может быть приостановлено. Единственным различием является то, что функции-генераторы не могут определять то, как должно продолжаться исполнение (что должно происходить) после выдачи значения — управление всегда передаётся коду, вызвавшему генератор.
Инструкция
yield
может употребляться и в конструкции try except. Если к генератору не обратились до его финализации (финализация происходит, когда счётчик ссылок доходит до нуля, либо когда происходит сборка мусора), будет вызван метод итератора .close()
, что позволяет выполнить оставшиеся в блоке finally
инструкции.Внимание
В версии +py2.2, была возможность использовать генераторы при помощи импорта
from __future__ import generators
.
Синонимы поиска: Generator (генератор), yield, yeild, генераторы
Статьи раздела
Generator expression (генераторное выражение) | Упрощенный синтаксический способ создания генератора. |
В разделе «def (функция/метод)»:
Decorator (декоратор)
На заметку
У нас есть представительство во ВКонтакте. Ссылка в самом низу страницы.