Ответ
Основное различие в том, что 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 |
|---|---|---|
| Тип функции | Обычная функция | Генератор |
| Поток выполнения | Завершается | Приостанавливается |
| Количество возвратов | Один раз | Многократно |
| Эффективность памяти | Может быть низкой (если возвращается большая коллекция) | Высокая (ленивые вычисления) |
| Основное применение | Возврат конечного результата вычислений | Создание итераторов, обработка больших потоков данных |