Значение выражения yield
после возобновления зависит от метода, который возобновил выполнение. Если используется __next__()
(обычно через for
или встроенный next()
), то результатом будет None
. В противном случае, если используется send()
, результатом будет значение, переданное этому методу.
Итак, это:
def f():
yield (yield 1)
Эквивалентно этому:
def f():
x = yield 1
yield x
Что в данном случае (поскольку вы не используете generator.send()
) эквивалентно этому:
def f():
yield 1
yield None
Ваш код просматривает только первый элемент, полученный генератором. Если вместо этого вы позвоните list()
, чтобы использовать всю последовательность, вы увидите, что я описываю:
def f():
yield (yield 1)
def g():
yield (yield (yield 1))
print(list(f()))
print(list(g()))
Выход:
$ python3 yield.py
[1, None]
[1, None, None]
Если мы итерируем генератор вручную (как у вас), но .send()
его значения, то вы можете увидеть, что yield
«возвращает» это значение:
gen = f()
print(next(gen))
print(gen.send(42))
Выход:
$ python3 yield_manual.py
1
42