Когда стоит использовать yield вместо return в Python

Оператор 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)

Вывод:

Функция с 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)

Вывод:

Максим
Я создал этот блог в 2018 году, чтобы распространять полезные учебные материалы, документации и уроки на русском. На сайте опубликовано множество статей по основам python и библиотекам, уроков для начинающих и примеров написания программ.
Мои контакты: Почта
admin@pythonru.comAlex Zabrodin2018-10-26OnlinePython, Programming, HTML, CSS, JavaScript