Итак, у меня есть следующая функция генератора:
def gen(n=5):
for i in range(n):
n = yield n
for i in gen(3):
print(i)
3
None
None
Я понимаю, что первый результат yield равен 3. Потому что я присвоил 3 аргументу функции n. Но откуда берутся None во втором и третьем доходе? Это потому, что в цикле for yield n возвращает None, и это None присваивается n в этой строке: n = yield n?
Да, вы предоставили свое объяснение.
вы должны вызвать gen() из ВНУТРИ цикла
@Roland А зачем тебе это?






Мне кажется, вы сами ответили на свой вопрос:
потому что в цикле yield n возвращает None, а None присваивается n в этой строке: n = yield n
Вы можете прочитать больше в этом ответе.
Это объясняется в документации по выражениям yield, особенно в этой части:
Значение выражения yield после возобновления зависит от метода который возобновил казнь. Если используется next() (обычно через либо for, либо встроенная функция next()), тогда результатом будет None. В противном случае, если используется send(), результатом будет переданное значение в этом методе.
Поскольку вы используете цикл for, n просто получает None в качестве значения при возобновлении после первого выхода. Итак, отныне n есть None, и это то, что будет выдаваться в последние два раза.
Спасибо. Теперь я понимаю. Интересно, что send() предназначен для изменения значения результата выражения yield. Я думал, что send() должен был вставить новое значение в полученную последовательность.
Что вы узнали из генератора и документации оператора?