Чем отличаются ключевые слова return и yield в Python

Ответ

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

return

  • Действие: Немедленно прекращает выполнение функции.
  • Результат: Возвращает одно значение или объект.
  • Состояние: Локальные переменные и состояние функции уничтожаются после вызова.
def get_list_with_return():
    # Создает и возвращает весь список сразу, занимая память
    result = []
    for i in range(3):
        result.append(i)
    return result

my_list = get_list_with_return()
# my_list -> [0, 1, 2]

yield

  • Действие: Приостанавливает выполнение, "отдавая" значение.
  • Результат: Функция становится генератором, возвращающим итератор.
  • Состояние: Состояние (включая локальные переменные) сохраняется между вызовами.
def generate_numbers_with_yield():
    # Отдает значения по одному, не храня все в памяти
    print("Генератор начал работу")
    for i in range(3):
        print(f"...yield {i}")
        yield i
    print("Генератор завершил работу")

# Использование генератора
gen = generate_numbers_with_yield()
print(next(gen)) # Выполнит код до первого yield
print(next(gen)) # Возобновит работу с места остановки

# Вывод:
# Генератор начал работу
# ...yield 0
# 0
# ...yield 1
# 1

Сравнительная таблица

Аспект return yield
Тип функции Обычная функция Генератор
Поток выполнения Завершается Приостанавливается
Количество возвратов Один раз Многократно
Эффективность памяти Может быть низкой (если возвращается большая коллекция) Высокая (ленивые вычисления)
Основное применение Возврат конечного результата вычислений Создание итераторов, обработка больших потоков данных