Книга: PyNEng
Назад: Итератор
Дальше: Дополнительные материалы

Generator

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, а генераторное выражение.

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

Назад: Итератор
Дальше: Дополнительные материалы