Выбор ответа Senior Итераторы и генераторы обновлено
send в генератор
Вопрос
Что выведет код?
def acc():
total = 10
while True:
x = yield total
total += x
g = acc()
print(next(g), g.send(5))
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: 10 15. Первый next(g) доводит генератор до первого yield и отдаёт total, то есть 10. g.send(5) возобновляет генератор, и выражение yield total становится равным 5, total растёт до 15, цикл возвращается к yield и отдаёт 15.
Варианты ответа
10 15правильный ответ10 105 15TypeError
Разбор
Первый next(g) доводит генератор до первого yield и отдаёт total, то есть 10. g.send(5) возобновляет генератор, и выражение yield total становится равным 5, total растёт до 15, цикл возвращается к yield и отдаёт 15. Отправить не-None в только что созданный генератор нельзя (TypeError), но здесь генератор уже запущен через next.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Итераторы и генераторы»
- Когда выполняется тело генератора
- Разбить последовательность на пачки
- Рекурсивно развернуть вложенные списки
- Конвейер обработки лога на генераторах
- Свой итерируемый класс, который можно обходить много раз
- Когда выполняется finally в недочитанном генераторе
- Полезные функции itertools
- Ленивые вычисления