myVar = (yield)

问题描述 投票:31回答:3

我熟悉用收益率来返回一个值,主要是由于 这个问题

但当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的时候。

python yield
3个回答
37
投票

yield 语句将该函数变成一个 "生成器"(创建迭代器的函数)。生成的迭代器通常通过调用 next(). 但是,也可以通过调用方法 send() 而不是 next() 来恢复它。

cr.send(1)

在你的例子中,这将会分配一个值 1c 每次。

cr.next() 实际上相当于 cr.send(None)


11
投票

你可以使用 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.

你可以找到更多信息 此处.


0
投票
  • yield 按照生成函数中定义的逻辑返回一个数据流。
  • 然而,send(val)是一种从生成函数外部传递所需值的方法。

p.next()在python3中不起作用,next(p)在python2,3中都可以使用(内置)

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

© www.soinside.com 2019 - 2024. All rights reserved.