Будут выведены 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.