yield from从容器中取值
yield from从容器中取值,容器包含生成器,也就是说yield from让一个生成器将其部分操作委派给另外一个生成器。
def reverse(x):
while x-1>=0:
yield x-1
x -=1
def list_number(x):
yield from range(x)
yield from range(x-1, -1, -1)
yield from reverse(x)
for i in list_number(3):
print(i,end=',')
out:
0,1,2,2,1,0,2,1,0,
关于send方法的案例
def count(): # 子生成器,将yield传来的数字累加,若传来的值为None,则返回累加结果
result = 0
while 1:
x = yield
if x is None:
return result
result += x
def count_list(x): # 父生成器,将累加任务委托给子生成器
while 1:
y = yield from count()
x.append(y)
plus_list = []
cal = count_list(plus_list)
next(cal) # 使生成器可以接收传入值
for i in range(1, 5):
cal.send(i)
cal.send(None) # 实际收到None的是count函数,结束累加
for i in range(1, 11):
cal.send(i)
cal.send(None) # 结束第二次累加
print(plus_list) # 输出最终结果
out:
[10, 55]
send方法两个注意点
- send方法要配合yield语句使用。
- send方法可以给yield传值,但yield尚未产生断点时传值会报错,所以先要对生成器执行一次next,然后才能正常传值。
深入理解send和yield from机制
send和yield from配合可以在调用者和生成器之间形成透明的双向数据通道,包括从生成器获取数据以及向生成器传送数据。
要更加深入理解send和yield机制需要学习和理解协程相关的知识点。留待日后梳理协程知识点时再细讲send和yield from。