Генераторы в Python предоставляют несколько специальных методов для управления их выполнением. Вот основные методы, доступные для объектов-генераторов:
Основной метод для получения следующего значения из генератора.
def simple_gen():
yield 1
yield 2
gen = simple_gen()
print(gen.__next__()) # 1
print(next(gen)) # 2 (альтернативный синтаксис)
print(next(gen)) # Вызывает StopIteration
Особенности:
yieldStopIterationОтправляет значение в генератор, которое становится результатом выражения 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__() — поддержка итерационного протоколаЭти методы позволяют создавать гибкие и выразительные генераторы, которые могут:
Понимание этих методов критически важно для создания сложных генераторных паттернов и асинхронных конструкций.