Почему выражение доходности рушится? - PullRequest
0 голосов
/ 09 сентября 2018

Я возился и заметил, что следующий код возвращает значение один раз, в то время как я ожидал, что он вернет объект генератора.

def f():
    yield (yield 1) 
f().next() # returns 1

def g():
    yield (yield (yield 1) 
g().next() # returns 1

Мой вопрос: что такое value выражения yield, а также почему нам разрешено вложить выражение yield, если выражение yield свернуто?

1 Ответ

0 голосов
/ 09 сентября 2018

Значение выражения 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...