gpt4 book ai didi

python - 在同一个生成器上发送和接收值

转载 作者:太空宇宙 更新时间:2023-11-04 01:31:30 25 4
gpt4 key购买 nike

我正在尝试了解 python 生成器的一些微妙细节。我编写的测试程序之一是看我是否可以向/从同一个生成器发送和读取交替值如下:

def injector():
while True:
try:
print 'a'
v = yield
print 'b', v
yield v
print 'c'
except GeneratorExit:
print 'exit'
break

g = injector()

print 'send none'
g.send(None)
print 'send 2'
g.send(2)
print 'receiving'
v = g.next()
print 'received', v

g.close()

这个程序的预期输出是:

send none
a
send 2
b 2
receiving
received 2
c
a
exit

我得到的输出是:

send none
a
send 2
b 2
receiving
c
a
received None
exit

现在,显然,问题是为什么我会得到上面的输出?关于生成器的工作原理,我不明白什么?

最佳答案

让我试着澄清一下:

def injector():
while True:
try:
print 'a'
v = yield
print 'b', v
yield v
print 'c'
except GeneratorExit:
print 'exit'
break

g = injector()

print 'send none'
g.send(None)

这里协程开始了。它一直执行到第一个 yield,其结果从 .send() 返回,但随后被丢弃。

协程打印a 并没有产生任何结果,因此None。所以丢弃是可以的。

print 'send 2'
g.send(2)

在这里,您向协程发送了一个 2,使其从您离开的地方继续。 v = 2

它打印 2 并再次产生 v。您会期望从 g.send() 调用中得到。所以在接收并丢弃 v 之后,你做

print 'receiving'
v = g.next()

在这里,您再次将控制权交给协程,它打印 c,然后打印 a,然后再次生成 None,如您所见。

print 'received', v

因此为 v 打印 None

你可能想要的是

g = injector()

print 'send none'
g.send(None)
print 'send 2'
v = g.send(2)
print 'received', v

g.close()

(请注意,最后一个 block 可以写得更干净、更漂亮,如下所示:

from contextlib import closing
with closing(injector()) as g:
print 'send none'
g.send(None)
print 'send 2'
v = g.send(2)
print 'received', v

)

关于python - 在同一个生成器上发送和接收值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13626263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com