Yield 作为赋值有什么作用? myVar =(产量)

发布于 2024-08-16 19:01:32 字数 588 浏览 3 评论 0原文

我熟悉 Yield 返回值,这主要归功于 这个问题< /a>

但是当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

我在 此博客,同时研究状态机和协程。

I'm familiar with yield to return a value thanks mostly to this question

but what does yield do when it is on the right side of an assignment?

@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

I came across this, on the code samples of this blog, while researching state machines and coroutines.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

久光 2024-08-23 19:01:32

函数中使用的 yield 语句将该函数转变为“生成器”(创建迭代器的函数)。生成的迭代器通常通过调用 next() 来恢复。但是,可以通过调用方法 send() 而不是 next() 来将值发送到函数来恢复它:

cr.send(1)

在您的示例中,这将分配值1 到 c

cr.next() 实际上等同于 cr.send(None)

The yield statement used in a function turns that function into a "generator" (a function that creates an iterator). The resulting iterator is normally resumed by calling next(). However it is possible to send values to the function by calling the method send() instead of next() to resume it:

cr.send(1)

In your example this would assign the value 1 to c each time.

cr.next() is effectively equivalent to cr.send(None)

宣告ˉ结束 2024-08-23 19:01:32

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

您可以在此处找到更多信息。

You can send values to the generator using the send function.

If you execute:

p = protocol()
p.next() # advance to the yield statement, otherwise I can't call send
p.send(5)

then yield will return 5, so inside the generator c will be 5.

Also, if you call p.next(), yield will return None.

You can find more information here.

傻比既视感 2024-08-23 19:01:32
  • yield 根据生成器函数中定义的逻辑返回数据流。
  • 然而,send(val) 是一种从生成器函数外部传递所需值的方法。

p.next() 在 python3 中不起作用,next(p) 对 python 2,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

  • yield returns a stream of data as per the logic defined within the generator function.
  • However, send(val) is a way to pass a desired value from outside the generator function.

p.next() doesn't work in python3, next(p) works (built-in) for both python 2,3

p.next() doesn't work with python 3, gives the following error,however it still works in python 2.

Error: 'generator' object has no attribute 'next'

Here's a demonstration:

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文