Генераторы в Python предоставляют несколько специальных методов для управления их выполнением. Вот основные методы, доступные для объектов-генераторов:
Основной метод для получения следующего значения из генератора.
def simple_gen():
yield 1
yield 2
gen = simple_gen()
print(gen.__next__()) # 1
print(next(gen)) # 2 (альтернативный синтаксис)
print(next(gen)) # Вызывает StopIteration
Особенности:
yield
StopIteration
Отправляет значение в генератор, которое становится результатом выражения yield
.
def echo_gen():
while True:
received = yield
yield f"Received: {received}"
gen = echo_gen()
next(gen) # Инициализация (доходим до первого yield)
print(gen.send("hello")) # Received: hello
Важно:
next()
, а не send()
Генерирует исключение в точке выполнения генератора.
def resilient_gen():
try:
yield 1
yield 2
except ValueError:
yield "Error handled"
gen = resilient_gen()
print(next(gen)) # 1
print(gen.throw(ValueError)) # Error handled
Применение:
Завершает работу генератора, вызывая GeneratorExit
в точке его выполнения.
def cleanup_gen():
try:
yield 1
yield 2
except GeneratorExit:
print("Cleaning up")
gen = cleanup_gen()
print(next(gen)) # 1
gen.close() # Cleaning up
Особенности:
GeneratorExit
внутри генератораДелает генератор итерируемым объектом (возвращает сам генератор).
gen = (x for x in range(3))
print(gen.__iter__() is gen) # True
Для чего:
def interactive_gen():
total = 0
while True:
try:
value = yield total
total += value
except ResetException:
total = 0
except CloseException:
return total
gen = interactive_gen()
next(gen) # Инициализация
print(gen.send(10)) # 10
print(gen.send(20)) # 30
print(gen.throw(ResetException)) # 0
print(gen.close()) # None (завершает выполнение)
def gen_with_return():
yield 1
yield 2
return "Done"
gen = gen_with_return()
print(next(gen)) # 1
print(next(gen)) # 2
try:
next(gen)
except StopIteration as e:
print(e.value) # Done
Метод | Назначение | Можно ли после завершения |
---|---|---|
__next__() | Получить следующее значение | Нет (StopIteration) |
send() | Отправить значение в генератор | Нет |
throw() | Вызвать исключение в генераторе | Нет |
close() | Завершить работу генератора | Да (но генератор закрыт) |
__iter__() | Поддержка итерационного протокола | Всегда доступен |
Генераторы в Python предоставляют мощный набор методов для управления их выполнением:
next()
— базовый метод получения значенийsend()
— для двусторонней коммуникацииthrow()
— для обработки исключений внутри генератораclose()
— для корректного завершения__iter__()
— поддержка итерационного протоколаЭти методы позволяют создавать гибкие и выразительные генераторы, которые могут:
Понимание этих методов критически важно для создания сложных генераторных паттернов и асинхронных конструкций.