Короткий ответ
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, чтобы не строить всю коллекцию в памяти.
Подводные камни
- Смешение стилей. В генераторной функции
returnбез значения лишь завершает итерацию и вернуть данные не может. - Ранний старт. Код до первого
yieldвыполняется не при вызове функции, а при первом запросе значения. - Исчерпание. Один генератор можно обойти только один раз; для повторного прохода нужно создавать новый.
Как отвечать на собеседовании
- Сравни поведение:
returnзавершает функцию и уничтожает её состояние, аyieldприостанавливает и сохраняет его → покажи пример двух функций с одинаковым результатом → объясни, чтоyieldнужен для последовательностей и экономии памяти → укажи, что генератор исчерпывается после прохода.