只需了解一下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
任何人都可以解释吗?
答案 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)}')