- en
- Language: ru
- Documentation version: latest
Генератор (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, а генераторное выражение.
Оно полезно в том случае, когда надо работать с большим итерируемым объектом или бесконечным итератором.