Что происходит, когда функция с генератором вызывает `return`?

Когда функция-генератор встречает `return`, итерация завершается. Независимо от того, указано ли после `return` какое-либо значение или нет, генератор выбрасывает исключение `StopIteration`, сигнализирующее об окончании последовательности. Дальнейшие попытки получить значения от генератора приведут к такому же исключению.

Когда функция-генератор вызывает `return`, происходят следующие вещи:

  1. Завершение генератора: `return` в генераторе сигнализирует о полном завершении работы генератора. Это эквивалентно достижению конца тела функции-генератора.
  2. Возбуждение исключения `StopIteration`: `return` не возвращает значение обычным способом (как это происходит в обычных функциях, возвращающих конкретное значение). Вместо этого, он вызывает исключение `StopIteration`. Это стандартный способ Python сигнализировать о том, что итератор (в данном случае, генератор) исчерпал все свои значения.
  3. Прекращение итерации: Когда цикл `for` или другая конструкция, потребляющая итератор, сталкивается с исключением `StopIteration`, она прекращает итерацию. Дальнейшие попытки получить значение из генератора приведут к `StopIteration`.
  4. Возвращаемое значение (Python 3.7+): Начиная с Python 3.7, `StopIteration` может нести с собой значение. Если `return` имеет аргумент (`return value`), то это значение становится свойством `value` исключения `StopIteration`. Это позволяет, в некоторых сложных случаях, получить информацию о причине завершения работы генератора. Без аргумента (`return`) `StopIteration` не имеет полезного value.

Пример:


def my_generator():
    yield 1
    yield 2
    return "Done!"  # Завершает генератор и возбуждает StopIteration

gen = my_generator()

print(next(gen))  # Вывод: 1
print(next(gen))  # Вывод: 2

try:
    print(next(gen))  # Возбуждает StopIteration
except StopIteration as e:
    print(f"Генератор завершен. Сообщение: {e}") # Вывод: Генератор завершен. Сообщение: Done! (если Python >= 3.7)

Важно отметить: В версиях Python младше 3.7 попытка передать значение с помощью `return` (например, `return "Done!"`) внутри генератора приведет к ошибке `SyntaxError`. Только начиная с Python 3.7 стало возможным возвращать значение через `StopIteration` таким образом.

В целом, `return` в генераторе служит для явного указания на окончание генерации последовательности значений.

0