首页 > 解决方案 > 协程可以在 Python 中产生值吗?

问题描述

所以我了解如何generators工作coroutines。从广义上讲,generators生产数据和coroutines消费数据。现在,我想做的是结合这两个功能。

我已经定义了 a coroutine,它接收 alist作为输入,然后尝试**yield**一次从列表中获取一个项目,就像 agenerator一样。

这是我的代码 -

def coroutine():
    print('Starting coroutine')
    value = (yield)
    for i in value:
        yield i



c=coroutine()
c.__next__()
c.send([1,2,3,4,5])


for val in c:
    print(val)

问题是,第一个列表项正在丢失。value 1没有从协程返回。

根据我的理解,流程应该如下。

  1. c=coroutine()----> 声明coroutine不启动它。
  2. c.__next__() ----> 这开始coroutine并前进到该行 - value = (yield)并停在那里。
  3. c.send([1,2,3,4,5]) ----> 这会将 new 传递list给等待的协程,即value = (yield). 协程现在继续yield执行 for 循环内的下一条语句。
  4. 主程序中的for 循环应该接收它最初传递的列表中的每一项。但这不会发生。

你能解释一下为什么吗?我试图这样做的原因是生成一个管道。每个组件将接收项目,对其进行修改,然后将其交给管道中的下一个协程。

请帮忙。

编辑 - - - - - - - - - -

输出如下 -

Starting coroutine
2
3
4
5

标签: pythonpython-3.xgeneratorpipelinecoroutine

解决方案


你错过了当调用 to 时send,corrutine 会一直到下一个yield并且那个会被调用,所以,如果你这样做:

c=coroutine()
c.__next__()
print(c.send([1,2,3,4,5]))


for val in c:
    print(val)

您将看到缺失值是如何打印的(因为它是在send调用中产生的)

这里有活生生的例子

yield对于您希望的行为,您可以向 corrutine添加额外的语句:

def coroutine():
    print('Starting coroutine')
    value = (yield)
    yield
    for i in value:
        yield i

推荐阅读