Поведение выхода генератора Python

Итак, у меня есть следующая функция генератора:

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?

Что вы узнали из генератора и документации оператора?

S3DEV 25.11.2022 13:27

Да, вы предоставили свое объяснение.

deceze 25.11.2022 13:30

вы должны вызвать gen() из ВНУТРИ цикла

Roland 25.11.2022 13:48

@Roland А зачем тебе это?

deceze 25.11.2022 14:01
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Мне кажется, вы сами ответили на свой вопрос:

потому что в цикле yield n возвращает None, а None присваивается n в этой строке: n = yield n

Вы можете прочитать больше в этом ответе.

Ответ принят как подходящий

Это объясняется в документации по выражениям yield, особенно в этой части:

Значение выражения yield после возобновления зависит от метода который возобновил казнь. Если используется next() (обычно через либо for, либо встроенная функция next()), тогда результатом будет None. В противном случае, если используется send(), результатом будет переданное значение в этом методе.

Поскольку вы используете цикл for, n просто получает None в качестве значения при возобновлении после первого выхода. Итак, отныне n есть None, и это то, что будет выдаваться в последние два раза.

Спасибо. Теперь я понимаю. Интересно, что send() предназначен для изменения значения результата выражения yield. Я думал, что send() должен был вставить новое значение в полученную последовательность.

CyberPlayerOne 25.11.2022 14:07

Другие вопросы по теме