2.7 KiB
title | localeTitle |
---|---|
Generators | Генераторы |
Генераторы
Генераторы - это особый тип функции, который позволяет возвращать значения без завершения функции. Он делает это, используя ключевое слово yield
. Подобно return
, выражение yield
возвращает значение вызывающему. Ключевое различие между ними состоит в том, что yield
приостанавливает функцию, позволяя в будущем возвращать больше значений.
Генераторы являются итерабельными, поэтому их можно использовать чисто для циклов или чего-либо еще, что итерации.
def my_generator():
yield 'hello'
yield 'world'
yield '!'
for item in my_generator():
print(item)
# output:
# hello
# world
# !
Как и другие итераторы, генераторы могут быть переданы next
функции для извлечения следующего элемента. Когда генератор не имеет больше значений, StopIteration
ошибка StopIteration
.
g = my_generator()
print(next(g))
# 'hello'
print(next(g))
# 'world'
print(next(g))
# '!'
print(next(g))
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# StopIteration
Генераторы особенно полезны, когда вам нужно создать большой набор значений, но им не нужно сохранять их все в памяти одновременно. Например, если вам нужно напечатать первые миллионы чисел фибоначчи, вы обычно возвращаете список из миллиона значений и перебираете список для печати каждого значения. Однако с генератором вы можете возвращать каждое значение по одному за раз:
def fib(n):
a = 1
b = 1
for i in range(n):
yield a
a, b = b, a + b
for x in fib(1000000):
print(x)