generators
Introduction
В этой статье вы узнаете о том что такое генераторы в Python 3.
Создайте файл
generators_demo.py
и копируйте туда код из примеров.
Запустить файл можно командой
python3 generators_demo.py
По объектам списка можно перемещаться разными способами. Если список
небольшой - прекрасно подойдёт, например, функция
enumerate
Генераторы нужны для больших объектов. Например, для таких, которые не помещаются
в памяти.
Так как их невозможно загрузить целиком, обычные способы итерации не подходят и на
помощь приходят генераторы.
Идея состоит в том, что особым образом передаётся только следующий
элемент объекта - это называется lazy evaluation или ленивое вычисление
Ключевое слово, по которому можно опознать генератор в коде
это yield
Генератор может включать в себя и обычные return но чтобы быть
генератором нужен хотя бы один yield
def gen123():
yield 1
yield 2
yield 3
g = gen123()
print(g)
print(next(g))
print(next(g))
print(next(g))
print(next(g)) # нужно закомментировать чтобы код работал дальше
python generators_demo.py
<generator object gen123 at 0x01AADCD8>
1
2
3
Traceback (most recent call last):
File "generators_demo.py", line 12, in
Каждый вызов функции-генератора создаёт новый генератор-объект (generator object)
h = gen123()
i = gen123()
print(h)
print(i)
print(h is i)
<generator object gen123 at 0x00F7DD48>
<generator object gen123 at 0x00F7DD80>
False
Соответственно и итерация по ним независимая
print(next(h))
print(next(h))
print(next(i))
1
2
1
def gen246():
print("About to yield 2")
yield 2
print("About to yield 4")
yield 4
print("About to yield 6")
yield 6
print("About to return")
g = gen246()
print(next(g))
print(next(g))
print(next(g))
print(next(g))
python generators_demo.py
About to yield 2
2
About to yield 4
4
About to yield 6
6
About to return
Traceback (most recent call last):
File "generators_demo.py", line 43, in
Более сложные случаи применения генераторов рассмотрим в следующих статьях: