Ключевое слово 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
позволяет функции возвращать генератор. Это удобно, если вам нужно сохранить локальные переменные для вычисления следующего значения. Генераторы можно использовать в циклах или списковых включениях так же, как и списки, кортежи и другие итерируемые объекты.
Возможно будет интересно
🏆 Hello, world!
Мы вчера запустили новый www.pylot.me. Должны были в следующую среду, но запустили вчера.
Как практиковаться в Python?
Для улучшения качества знаний и повышения уровня программиста, необходим постоянный практикум. Где можно это организовать самостоятельно, и как практиковаться в Python?
Условные конструкции и сопоставление структурных шаблонов
Шпаргалка по условным конструкциям и сопоставлению структурных шаблонов