Функция, возвращающая подвид итератора, генерирующий значения.
На заметку
Словом «генератор» обычно обозначается функция-генератор (или метод-генератор), возвращающая итератор генератора. Однако иногда слово может быть использовано и для обозначения самого итератора. В случаях, когда контекст непонятен лучше использовать полные термины: функция-генератор и итератор генератора. Итератор генератора — это объект, порождаемый функцией-генератором.

На заметку
Генераторы являются простым средством для создания итераторов. Всё, что можно сделать при помощи генераторов можно также сделать при помощи итераторов, построенных на классах. Но в случае генераторов методы __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 (декоратор)
На заметку
Зарегистрированные пользователи могут получать еженедельный дайджест обновлений на сайте.