Вопрос проверяет понимание, что генератор “останавливается и продолжает” выполнение, сохраняя состояние между вызовами.
Генератор — это функция, которая возвращает значения по одному через yield. При next(gen) выполнение продолжается с места последнего yield, пока не встретится следующий yield или функция не завершится. Все локальные переменные и позиция выполнения сохраняются внутри генератора. Если значения больше нет, генератор завершает работу и возбуждает StopIteration.
Генератор можно представить как “функцию с паузой”, которая хранит своё состояние между вызовами.
Определение: yield — операция, которая возвращает значение наружу и “замораживает” выполнение функции, сохраняя её состояние.
next() пошаговоКогда вы вызываете next(gen):
Если это первый вызов, генератор стартует с начала функции.
Интерпретатор выполняет код до ближайшего yield.
Значение после yield отдаётся наружу как результат next(...).
Генератор “замораживается”:
сохраняется текущая позиция выполнения;
сохраняются локальные переменные;
сохраняется внутреннее состояние (условно, “кадры” выполнения).
Следующий next(gen) продолжит выполнение сразу после того yield, на котором остановились.
def gen():
x = 10
yield x
x += 5
yield x
g = gen()
print(next(g)) # 10
print(next(g)) # 15
Генератор не “пересчитывает всё заново”: он продолжает выполнение.
Локальные переменные живут между вызовами, пока генератор не завершится.
После завершения дальнейшие next() всегда приводят к StopIteration.
next() возобновляет выполнение генератора с сохранённого места, доводит до следующего yield, возвращает значение и снова приостанавливает генератор, сохраняя состояние.