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

Какова роль конструкции yield from в Python?

Sobes Copilot

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

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

sobes.tech AI

Конструкция yield from используется для делегирования управления итерации от одного генератора (делегирующего генератора) к другому генератору или итератору (генератору-субгенератору).

Основные особенности yield from:

  • Упрощает чтение кода: Заменяет собой более сложную логику обработки подгенератора с явными send и throw.
  • Автоматически обрабатывает исключения: Исключения, отправленные в делегирующий генератор, передаются субгенератору.
  • Автоматически обрабатывает возвращаемое значение: Значение, возвращенное субгенератором (через return), становится значением выражения yield from.
# Пример без yield from (сложнее)
def subgenerator_manual():
    yield 1
    yield 2
    return "Manual result"

def delegator_manual():
    sub = subgenerator_manual()
    try:
        value = next(sub)
        while True:
            try:
                sent = yield value
                value = sub.send(sent)
            except StopIteration as e:
                return e.value
    except StopIteration as e:
        return e.value

# Пример с yield from (проще)
def subgenerator_yield_from():
    yield 10
    yield 20
    return "Yield from result"

def delegator_yield_from():
    result = yield from subgenerator_yield_from()
    print(f"Subgenerator returned: {result}") # Отображает значение, возвращенное субгенератором
    yield 30

# Использование
g_manual = delegator_manual()
print(list(g_manual))

g_yield_from = delegator_yield_from()
print(list(g_yield_from))

В примере с yield from, основной генератор delegator_yield_from делегирует итерацию subgenerator_yield_from. Когда subgenerator_yield_from завершается с помощью return, возвращаемое значение ("Yield from result") присваивается переменной result в delegator_yield_from.