收益和收益-您可以将它们合并吗?

时间:2019-11-28 14:10:30

标签: python

只需了解一下yield from构造,就我的想法而言,它类似于反转的yield,您无需将对象从生成器中取出,而是将对象插入/发送到生成器。喜欢:

def foo():
    while True:
        x = (yield)
        print(f'{x=}')

f = foo()
f.send(None)
for i in range(4):
    f.send(i)

产量:

x=0
x=1
x=2
x=3

所以我想知道是否可以将两者结合起来。

def foo():
    while True:
        x = (yield)
        print(f'{x=}')
        yield x + 1000

f = foo()
f.send(None)
for i in range(4):
    print(f'y={f.send(i)}')

那我期望

x=0
y=1000
x=1
y=1001
x=2
y=1002
x=3
y=1003

但我明白了

x=0
y=1000
y=None
x=2
y=1002
y=None

任何人都可以解释吗?

1 个答案:

答案 0 :(得分:3)

如果您要“将两者结合起来”,那么将yield视为发送值,然后从外部接受值的点很有用。这样,您可能会理解为什么没有在每行替换行上打印出“ x =”并在输出的每三行得到None的原因。这是因为该控件在foo(..)块中的每个循环中两次退出while

这是您代码的固定版本:

def foo():
    x = 0
    while True:
        x = (yield x + 1000)
        print(f'{x=}')

f = foo()
f.send(None)
for i in range(4):
    print(f'y={f.send(i)}')