我熟悉用收益率来返回一个值,主要是由于 这个问题
但当yield在赋值的右边时,它是怎么做的呢?
@coroutine
def protocol(target=None):
while True:
c = (yield)
def coroutine(func):
def start(*args,**kwargs):
cr = func(*args,**kwargs)
cr.next()
return cr
return start
我遇到了这个问题,在代码样本上的 本博客在研究状态机和coroutine的时候。
在 yield
语句将该函数变成一个 "生成器"(创建迭代器的函数)。生成的迭代器通常通过调用 next()
. 但是,也可以通过调用方法 send()
而不是 next()
来恢复它。
cr.send(1)
在你的例子中,这将会分配一个值 1
到 c
每次。
cr.next()
实际上相当于 cr.send(None)
你可以使用 send
功能。
如果你执行。
p = protocol()
p.next() # advance to the yield statement, otherwise I can't call send
p.send(5)
那么 yield
将返回5,所以在生成器内 c
将是5。
另外,如果你叫 p.next()
, yield
将返回 None
.
你可以找到更多信息 此处.
yield
按照生成函数中定义的逻辑返回一个数据流。p.next()在python 3中不能工作,给出了以下错误,但在python 2中仍然可以工作。
Error: 'generator' object has no attribute 'next'
下面是一个示范。
def fun(li):
if len(li):
val = yield len(li)
print(val)
yield None
g = fun([1,2,3,4,5,6])
next(g) # len(li) i.e. 6 is assigned to val
g.send(8) # 8 is assigned to val