协同程序能否产生 Python 中的值?
Can a coroutine yield values in Python?
所以我了解 generators
和 coroutines
是如何工作的。从广义上讲,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
未从协程返回。
根据我的理解,流程应该是这样的。
c=coroutine()
----> 声明 coroutine
而不启动它。
c.__next__()
----> 这将启动 coroutine
并前进到行 - value = (yield)
并在那里停止。
c.send([1,2,3,4,5])
----> 这会将新的 list
传递给正在等待的协程,即 value = (yield)
。协程现在继续 for 循环内的下一个 yield
语句。
- 主程序中的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
所以我了解 generators
和 coroutines
是如何工作的。从广义上讲,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
未从协程返回。
根据我的理解,流程应该是这样的。
c=coroutine()
----> 声明coroutine
而不启动它。c.__next__()
----> 这将启动coroutine
并前进到行 -value = (yield)
并在那里停止。c.send([1,2,3,4,5])
----> 这会将新的list
传递给正在等待的协程,即value = (yield)
。协程现在继续 for 循环内的下一个yield
语句。- 主程序中的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