Generator

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

Обычная функция завершает работу, если:

  • встретилось выражение return

  • закончился код функции (это срабатывает как выражение return None)

  • возникло исключение

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

Функция может возвращать список элементов, несколько объектов или возвращать разные результаты в зависимости от аргументов, но она всегда возвращает какой-то один результат.

Генератор же генерирует значения. При этом значения возвращаются по запросу, и после возврата одного значения выполнение функции-генератора приостанавливается до запроса следующего значения. Между запросами генератор сохраняет свое состояние.

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

  • генераторное выражение

  • функция-генератор

Ниже пример генераторного выражения, а по функциям-генераторам - отдельная заметка

generator expression (генераторное выражение)

Генераторное выражение использует такой же синтаксис, как list comprehensions, но возвращает итератор, а не список.

Генераторное выражение выглядит точно так же, как list comprehensions, но используются круглые скобки:

In [1]: genexpr = (x**2 for x in range(10000))
In [2]: genexpr
Out[2]: <generator object <genexpr> at 0xb571ec8c>
In [3]: next(genexpr)
Out[3]: 0
In [4]: next(genexpr)
Out[4]: 1
In [5]: next(genexpr)
Out[5]: 4

Обратите внимание, что это не tuple comprehensions, а генераторное выражение.

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