Короткий ответ
return завершает функцию и передаёт вызывающему коду единственное значение, а yield лишь приостанавливает функцию, возвращает промежуточный результат и сохраняет состояние. Функция с yield становится генераторной и может отдавать значения многократно.
Как это работает подробнее
- return. Функция прекращает работу, возвращает одно значение, а её локальные переменные уничтожаются; при повторном вызове она стартует заново.
- yield. Функция замирает, возвращает промежуточный результат и сохраняет состояние — локальные переменные и позицию исполнения.
- Продолжение. Код после
yieldвыполняется при последующем обращении, а функция продолжается с того же места. - Область применения.
yieldиспользуют для порождения последовательностей и потоковой обработки без построения всей коллекции,return— для единственного финального результата.
Пример кода
Сравнение поведения return и yield
def with_return():
return 1 + 2 + 3 # функция завершается и возвращает 6
def with_yield():
yield 1 # каждый вызов next() продолжает выполнение
yield 2
yield 3
print(with_return()) # 6
print(list(with_yield())) # [1, 2, 3]Что использовать на практике
- Один результат. Если функция вычисляет единственное значение, используй
return. - Серия значений. Когда нужно отдавать последовательность по одному элементу, делай функцию генераторной через
yield. - Потоковая обработка. Для больших и бесконечных данных предпочитай
yield, чтобы не строить всю коллекцию в памяти.