Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Методы генератора в Python
Генератор — это специальная функция, которая возвращает объект-генератор и позволяет итерировать значения по одному, сохраняя состояние между вызовами. Python предоставляет несколько важных методов для работы с генераторами.
Основные методы
1. send(value) — отправка значения в генератор
Метод send() позволяет отправить значение в генератор и получить следующее значение. Это полезно для создания двусторонней коммуникации между вызывающим кодом и генератором.
def generator():
x = yield "первое значение"
print(f"Получено значение: {x}")
y = yield "второе значение"
print(f"Получено значение: {y}")
gen = generator()
print(next(gen)) # Вывод: первое значение
print(gen.send(42)) # Вывод: Получено значение: 42, Вывод: второе значение
print(gen.send(100)) # Вывод: Получено значение: 100
При первом вызове используй next() или send(None), иначе получишь ошибку TypeError.
2. throw(exception) — генерация исключения
Метод throw() позволяет генерировать исключение внутри генератора.
def generator():
try:
yield 1
yield 2
yield 3
except ValueError as e:
print(f"Поймали ошибку: {e}")
yield 999
gen = generator()
print(next(gen)) # 1
print(gen.throw(ValueError, "Что-то пошло не так")) # Вывод ошибки, затем 999
3. close() — завершение генератора
Метод close() завершает генератор, генерируя исключение GeneratorExit внутри него. Это полезно для корректной очистки ресурсов.
def generator():
try:
yield 1
yield 2
finally:
print("Генератор завершен, очищаю ресурсы")
gen = generator()
print(next(gen)) # 1
gen.close() # Вывод: Генератор завершен, очищаю ресурсы
Атрибуты генератора
gi_frame— текущий фрейм выполнения генератора (илиNone, если завершен)gi_code— объект кода генератораgi_running— булево значение, выполняется ли генератор в данный момент
Практические примеры
Двусторонняя коммуникация (Coroutines)
def echo_generator():
print("Генератор готов")
while True:
value = yield
print(f"Эхо: {value}")
gen = echo_generator()
next(gen) # Инициализируем
gen.send("Привет") # Вывод: Эхо: Привет
gen.send("Мир") # Вывод: Эхо: Мир
gen.close() # Завершаем
Обработка ошибок в генераторе
def safe_generator():
try:
yield "успех 1"
yield "успех 2"
except RuntimeError:
yield "ошибка обработана"
yield "восстановление"
gen = safe_generator()
print(next(gen)) # успех 1
print(gen.throw(RuntimeError)) # ошибка обработана
print(next(gen)) # восстановление
Когда использовать
- send() — для создания coroutines и двусторонней коммуникации
- throw() — для обработки ошибок в генераторах
- close() — для очистки ресурсов и контролируемого завершения
Эти методы делают генераторы мощным инструментом для создания асинхронного и реактивного кода в Python.