Генераторы в Python
Введение | |
Где вы уже сталкивались с генератором | |
Похожие статьи |
Введение
В этой статье вы узнаете о том что такое генераторы в 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 <module> print(next(g)) StopIteration
Каждый вызов функции-генератора создаёт новый генератор-объект (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 <module> print(next(g)) StopIteration
Где вы уже сталкивались с генератором
Если вы создавали цикл for то уже могли столкнуться с генератором
my_dict = {"a": 1, "b": 2, "c": 3, "d":4} letters = (l for l in my_dict) print(type(letters))
python generators_example.py
<class 'generator'>
Более сложные случаи применения генераторов рассмотрим в следующих статьях:
Maintaining State | |
Функции | |
Лямбда функции | |
all() | |
map() | |
Python | |
if, elif, else | |
Циклы | |
Методы | |
*args **kwargs | |
enum |