← Назад к вопросам

Какие знаешь методы генеротора в Python?

1.0 Junior🔥 161 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Методы генератора в 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.

Какие знаешь методы генеротора в Python? | PrepBro