我了解生成器和协程的工作原理。广义上讲,生成器生成数据而协程消耗数据。现在,我想要将这两个特性结合起来。
我定义了一个协程,它接收一个列表作为输入,然后尝试像生成器一样逐个**yield**列表中的项。
以下是我的代码 -
问题在于,第一个列表项丢失了。协程没有返回
根据我的理解,流程应该如下:
请帮忙解释一下。 编辑 -------------------- 输出结果如下:
我定义了一个协程,它接收一个列表作为输入,然后尝试像生成器一样逐个**yield**列表中的项。
以下是我的代码 -
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
传递给等待的coroutine
即value = (yield)
。协程现在继续执行for循环中下一个yield
语句。- 主程序中的for循环应该接收最初传递的列表的每个项。但这没有发生。
请帮忙解释一下。 编辑 -------------------- 输出结果如下:
Starting coroutine
2
3
4
5
yield
语句就会暂停,但是在返回某个值的yield
语句中,调用next
函数会使其继续执行,而等待某个值的协程则需要调用send
函数来继续执行。 - undefinedyield i
所以它产生了那个值,下一次迭代推进直到下一个yield,即下一个yield i
,依此类推。所以,是的,在获取值之后才会执行。 - undefined