Назад к вопросам
Middle
68
questionbank

Какие методы существуют у генераторов в Python?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Методы генераторов в Python:

Метод Описание
__next__() Возвращает следующий элемент генератора. Вызывает StopIteration при исчерпании элементов.
send(value) Возобновляет выполнение генератора и отправляет значение в точку yield. Возвращает следующий элемент генератора.
throw(type, value=None, traceback=None) Вызывает исключение внутри генератора в точке yield. Возвращает следующий элемент генератора после обработки исключения (если оно не прерывает выполнение).
close() Принудительно завершает выполнение генератора. Очищает ресурсы и вызывает GeneratorExit. Дальнейшие вызовы __next__ или send приведут к StopIteration.

Примеры использования:

# Создаем простой генератор
def simple_generator():
    yield 1
    yield 2
    yield 3
# Использование __next__()
gen = simple_generator()
print(next(gen)) # Equivalent to gen.__next__()
print(next(gen))
print(next(gen))
# next(gen) # This would raise StopIteration
# Использование send()
def send_example():
    value = yield 'First yield'
    print(f'Received in generator: {value}')
    value = yield 'Second yield'
    print(f'Received in generator: {value}')
gen_send = send_example()
print(next(gen_send)) # Starts the generator, yields 'First yield'
print(gen_send.send('Hello')) # Sends 'Hello' to the first yield, yields 'Second yield'
# gen_send.send('World') # Sends 'World' to the second yield, finishes execution
# Использование throw()
def throw_example():
    try:
        yield 1
    except ValueError as e:
        print(f'Caught exception in generator: {e}')
    yield 2
gen_throw = throw_example()
print(next(gen_throw))
print(gen_throw.throw(ValueError, 'Something went wrong'))
print(next(gen_throw))
# Использование close()
def close_example():
    try:
        yield 1
        yield 2
    finally:
        print('Generator is closing')
gen_close = close_example()
print(next(gen_close))
gen_close.close()
# next(gen_close) # This would raise StopIteration