def generator():
yield 1
yield 2
return 3
gen = generator()
print(next(gen))
print(next(gen))
print(next(gen))
Результат работы кода:
1
2
Traceback (most recent call last):
File "<stdin>", line 7, in <module>
StopIteration
Объяснение:
generator()
- это генератор.next(gen)
возвращают значения, полученные с помощью yield
: 1 и 2.return 3
, он завершает свою работу и генерирует исключение StopIteration
. Значение 3 игнорируется, так как return
в генераторе используется только для сигнализации завершения и, опционально, возврата значения, которое можно получить через атрибут value
у исключения StopIteration (начиная с Python 3.7).next(gen)
вызывает исключение StopIteration
, потому что генератор уже завершил свою работу.Этот код демонстрирует работу генератора в Python и то, как он обрабатывает оператор return
.
Генератор - это особый вид итератора, который позволяет генерировать значения "на лету", не храня всю последовательность в памяти сразу. Ключевое слово yield
приостанавливает выполнение функции и возвращает значение. При следующем вызове next()
, выполнение функции возобновляется с места, где оно было приостановлено.
def generator():
: Определяется функция-генератор с именем generator
.yield 1
: При первом вызове next(gen)
, функция выполнится до этой строки, вернет значение 1
и приостановит свое выполнение.yield 2
: При втором вызове next(gen)
, выполнение функции возобновится с предыдущей точки останова (после yield 1
), выполнится до этой строки, вернет значение 2
и снова приостановится.return 3
: При третьем вызове next(gen)
, выполнение возобновится после yield 2
. Функция выполнит return 3
. Оператор return
в генераторе, когда после него нет значений для yield
, вызывает исключение StopIteration
. Значение, возвращаемое return
, становится атрибутом value
этого исключения (доступно начиная с Python 3.3).gen = generator()
: Создается объект-генератор gen
, который еще не начал выполнение.print(next(gen))
: Вызывается next()
для генератора. Генератор возвращает 1
, которое выводится на экран.print(next(gen))
: Вызывается next()
снова. Генератор возвращает 2
, которое выводится на экран.print(next(gen))
: Вызывается next()
в третий раз. Генератор выполняет return 3
и выбрасывает исключение StopIteration
. Так как это исключение не перехвачено, программа завершается с ошибкой.
1
2
Traceback (most recent call last):
File "<stdin>", line 6, in <module>
StopIteration
yield
приостанавливает выполнение функции, сохраняя её состояние.next()
возобновляет выполнение функции с точки останова.return
в генераторе прекращает его работу и выбрасывает исключение StopIteration
.return
, становится доступным через атрибут value
исключения StopIteration
. Например:
def generator():
yield 1
return 3
gen = generator()
print(next(gen))
try:
next(gen)
except StopIteration as e:
print(f"Генератор завершен. Возвращенное значение: {e.value}") # Только в Python 3.3+