Генераторы - это специальный класс функций, который позволяет легко создавать свои итераторы. В отличии от обычных функций, генератор не просто возвращает значение и завершает работу, а возвращает итератор, который отдает элементы по одному.
Обычная функция завершает работу, если:
return None
)После выполнения функции управление возвращается, и программа выполняется дальше. Все аргументы, которые передавались в функцию, локальные переменные, все это теряется. Остается только результат, который вернула функция.
Функция может возвращать список элементов, несколько объектов или возвращать разные результаты в зависимости от аргументов, но она всегда возвращает какой-то один результат.
Генератор же генерирует значения. При этом значения возвращаются по запросу, и после возврата одного значения выполнение функции-генератора приостанавливается до запроса следующего значения. Между запросами генератор сохраняет свое состояние.
Python позволяет создавать генераторы двумя способами:
Ниже пример генераторного выражения, а по функциям-генераторам -
Генераторное выражение использует такой же синтаксис, как 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, а генераторное выражение.
Оно полезно в том случае, когда надо работать с большим итерируемым объектом или бесконечным итератором.