Ключевое слово yield Python

Ключевое слово yield

Ключевое слово yield иногда используется в функциях и методах вместо return. Чем они отличаются, зачем используется ключевое слово yield и как его применять — читайте далее.

return vs yield

Вы наверняка знакомы с ключевым словом return. Оно возвращает результат выполнения функции. Каждый новый вызов функции запускает ее заново — это гарантирует, что новый результат не будет зависеть от предыдущего.

>>> def func(a)
...     if a == 0:
...         return 0
...     else:
...         return 10/a
... func(0)
... func(2)
0
5

Функции с ключевым словом yield возвращают объекты-генераторы.

>>> def count(start, stop, step):
...     current = start
...     while current <= stop:
...         yield(current)
...         current += step
... 
... generator = count(0, 14, 4)
... print(type(generator))
...
<class 'generator'>

Как работают генераторы?

Генераторы во многом похожи на функции, но имеют одну интересную особенность. Они возвращают значения с сохранением своего состояния. Дойдя до ключевого слова yield, генератор вернет результат и приостановит работу. Если вызвать его снова, он продолжит работу с того же места, на котором остановился. Локальные переменные никуда не пропадут, и могут быть использованы, пока генератор не исчерпает себя. Генераторы можно вызывать в циклах for и while.

>>> for i in generator:
...     print(i)
0
4
8
12

Но как цикл узнает, что генератор исчерпал себя, и пора остановиться? Давайте попробуем вызывать генератор без цикла с помощью функции next().

>>> gen2 = count(1, 2, 1)
... next(gen2)
1
>>> next(gen2)
2
>>> next(gen2)
Traceback (most recent call last):
  File "C:\code.py", line 90, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>
StopIteration

Ошибка StopIteration возникает, когда генератор не может вернуть следующее значение. Поймав такую ошибку, цикл завершится. Бесконечные генераторы сами по себе никогда не закончат цикл.

def endless_zero():
    while True:
        yield(0)

Заключение

Ключевое слово yield позволяет функции возвращать генератор. Это удобно, если вам нужно сохранить локальные переменные для вычисления следующего значения. Генераторы можно использовать в циклах или списковых включениях так же, как и списки, кортежи и другие итерируемые объекты.

Практический Python для начинающих
Практический Python для начинающих

Станьте junior Python программистом за 7 месяцев

 7 месяцев

Возможно будет интересно

🏆 Hello, world! Python
Новичок
🏆 Hello, world!

Мы вчера запустили новый www.pylot.me. Должны были в следующую среду, но запустили вчера.

2022-10-04
Как практиковаться в Python? Python
Новичок
Как практиковаться в Python?

Для улучшения качества знаний и повышения уровня программиста, необходим постоянный практикум. Где можно это организовать самостоятельно, и как практиковаться в Python?

2022-10-19
Условные конструкции и сопоставление структурных шаблонов Шпаргалки
Новичок
Условные конструкции и сопоставление структурных шаблонов

Шпаргалка по условным конструкциям и сопоставлению структурных шаблонов

2022-11-09