协同程序能否产生 Python 中的值?

Can a coroutine yield values in Python?

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

我定义了一个 coroutine,它接收 list 作为输入,然后尝试 **yield** 一次从列表中选择一个项目,例如 generator会做。

这是我的代码 -

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]) ----> 这会将新的 list 传递给正在等待的协程,即 value = (yield)。协程现在继续 for 循环内的下一个 yield 语句。
  4. 主程序中的for 循环 应该接收它最初传递的列表的每个项目。但这并没有发生。

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

请帮忙。

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

输出结果如下-

Starting coroutine
2
3
4
5

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

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


for val in c:
    print(val)

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

这里有 live example

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

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