Что будет выведено в терминал?

Будут выведены Start, затем 0, 1, 2 и End — каждое значение на отдельной строке. yield from передаёт значения внутреннего генератора внешнему циклу.

Короткий ответ

Что ответить на собеседовании

Будут выведены Start, затем 0, 1, 2 и End — каждое значение на отдельной строке. yield from передаёт значения внутреннего генератора внешнему циклу.

Подробный разбор

Ответ с пояснениями

Условие

Что будет выведено в терминал?

def decorator(func):
    def wrapper(*args):
        print("Start")
        # func(*args)
        yield from func(*args)
        print("End")
    return wrapper
@decorator
def gen(n):
    for i in range(n):
        yield i
for x in gen(3):
    print(x)

Ответ

Будут выведены Start, затем 0, 1, 2 и End — каждое значение на отдельной строке. yield from передаёт значения внутреннего генератора внешнему циклу.

Наличие yield from делает wrapper генераторной функцией. Вызов gen(3) создаёт генератор, но его тело начинает выполняться только при первой итерации.

Start
0
1
2
End

После исчерпания func(*args) выполнение wrapper продолжается и печатает End. Если внешний потребитель досрочно прекратит обход, эта строка не обязательно выполнится. Для обязательного освобождения ресурсов нужен try/finally; обычный код после yield from не является гарантированным cleanup.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее