代码之家  ›  专栏  ›  技术社区  ›  Boudhayan Dev

协同程序能在Python中产生值吗?

  •  1
  • Boudhayan Dev  · 技术社区  · 7 年前

    所以我明白 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() 协同程序 不启动它。
    2. c.__next__() ----&燃气轮机;这就开始了 协同程序 它前进到终点线- value = (yield)
    3. c.send([1,2,3,4,5]) ----&燃气轮机;这通过了新的 列表 到等待的协同程序,即 yield for循环中的语句。
    4. for循环 在主程序中,应该接收它最初传递的列表中的每一项。但这不会发生。

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

    请帮忙。

    Starting coroutine
    2
    3
    4
    5
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Netwave    7 年前

    你打电话给我的时候没注意到 send yield 如果你这么做的话:

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

    您将看到如何打印缺少的值(在 发送

    给你这个 live example

    对于您想要的行为,您可以添加一个额外的 产量 对当事人的陈述:

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