Оператор yield приостанавливает выполнение функции и возвращает указанное значение обратно вызывающей стороне, при этом происходит сохранение состояния, чтобы функция могла возобновить выполнение с того места, на котором она остановилась. При повторном вызове такая функция продолжит выполнение, начиная со следующих за yield инструкций. Подобное поведение позволяет коду генерировать отдельные значения по мере надобности, а не вычислять все сразу, например, возвращая список.
Давайте посмотрим на следующий фрагмент:
# Простая программа на Python для демонстрации
# работы yield
# Функция-генератор, которая выдает 2 при
# первом обращении, 4 — при втором и
# 8 — при третьем
def simple_generator():
yield 2
yield 4
yield 8
# Код для проверки simple_generator()
for value in simple_generator():
print(value)
Вывод:
2
4
8
Функция с return отправляет указанное значение обратно вызвавшему его коду, в то время как yield может создавать последовательность возвращаемых значений. Мы должны использовать yield, когда хотим обработать множество объектов, но не хотим хранить их все в памяти.
Yield применяется в генераторах Python. Такой генератор определяется как обычная функция, но всякий раз, когда ей нужно выдать значение, она делает это с помощью ключевого слова yield, а не return. Если тело def содержит yield, то функция автоматически становится генератором.
# Программа на Python для генерации степеней 2
# от 2 до 256
def get_next_num():
n = 2
# Бесконечный цикл для генерации степеней 2
while True:
yield n
n *= 2 # При последующем обращении к
# get_next_num() выполнение
# продолжится отсюда
# Код для проверки get_next_num()
for num in get_next_num():
if num > 256:
break
print(num)
Вывод:
2
4
8
16
32
64
128
256