python - 协程可以在 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
没有从协程返回。
根据我的理解,流程应该如下。
c=coroutine()
----> 声明coroutine
不启动它。c.__next__()
----> 这开始coroutine
并前进到该行 -value = (yield)
并停在那里。c.send([1,2,3,4,5])
----> 这会将 new 传递list
给等待的协程,即value = (yield)
. 协程现在继续yield
执行 for 循环内的下一条语句。- 主程序中的for 循环应该接收它最初传递的列表中的每一项。但这不会发生。
你能解释一下为什么吗?我试图这样做的原因是生成一个管道。每个组件将接收项目,对其进行修改,然后将其交给管道中的下一个协程。
请帮忙。
编辑 - - - - - - - - - -
输出如下 -
Starting coroutine
2
3
4
5
解决方案
你错过了当调用 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
推荐阅读
- javascript - 了解动态生成 A-frame 对象的 setAttribute 和 appendChild 函数中的问题
- awk - 使用 awk 删除重复结果
- python - 使用 pip 安装 pycryptodome 3.4.3 时出错
- c# - C# 获取名称为变量的文本框
- python - 替换文本文件中的子字符串
- html - 分辨率变小时动态缩小 div | 视口或溢出问题
- node.js - 如何从节点js中的数据库中自动删除jsonwebtoken
- react-native - 反应导航嵌套抽屉项目
- flutter - 有没有一种快速的方法可以在我的颤振应用程序中使用带有选择语言选项的欢迎屏幕?
- arduino - ENC28j60 Arduino 不显示小数