Python 产量和产量-你能把它们结合起来吗?

Python 产量和产量-你能把它们结合起来吗?,python,Python,刚刚了解了来自构造的收益率,我认为这有点像反向的收益率,而不是从生成器中获取对象,而是插入/发送对象到生成器。比如: 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 Tr

刚刚了解了来自构造的
收益率,我认为这有点像反向的
收益率
,而不是从生成器中获取对象,而是插入/发送对象到生成器。比如:

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

任何人都可以解释这一点。

如果你“将两者结合起来”,将
收益率
视为一个发送值,然后从外部接受值的单一点是很有用的。这样,您可能会理解为什么不在输出中每隔三行打印“x=”和“get
None
s”一行。这是因为控件在
while
块中的每个循环中出现两次
foo(…)

以下是您的代码的固定版本:

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)}')

注意
f'{x=}'
仅适用于Python 3.8+版本。foo()中的一个yield同时执行两个函数:获取值和发送值。通过调试器运行它,我可以看到发生了什么。函数foo似乎首先从i获取值并打印它,然后它转到x=yield(x+1000)行并返回值为x+1000的循环。如果我在打印之前添加行x=x*2,结果是x=0,y=1000,x=2,y=1002,x=4,y=1004,x=6,y=1006。