yield from
def b(t):
for i in range(t):
yield i
def a():
for i in range(5):
yield from b(i) # 后面必须是一个可迭代对象
print('coninue')
zzz = a()
print(zzz) # <generator object a at 0x7f7ef68bc2b0>
r_1 = next(zzz) # 0 当 i == 0 时,b(0)没有任何返回值,所以 a() 会继续执行,即:print("continue"),i ==1,b(1) 可以返回 0,所以 r_1 == 0
r_2 = next(zzz) # 0 因为上面的 i == 1,即b(1) 只能返回一个 0,b()中的 for 循环就会跳出,所以没有返回值,这个时候,i == 2 ,即b(2) ,此时b(2) 的第一次循环首先返回 0 ,然后停止
r_3 = next(zzz) # 1 再次调用 next(),i == 2时,即b(2) 还没有循环完,所以b(2) 会继续循环,返回 1
r_4 = next(zzz) # 0 当b(2) 返回 1 后,就又会结束循环且没有返回值,所以, a() 又开始循环, i == 3,即 b(3),首先返回的是 0 , 停在此处
r_5 = next(zzz) # 1 再次调用next(),即 i ==3 时,还没有结束,此时b(3) 会返回 1, 然后停在此处
r_6 = next(zzz) # 2 再次调用 next(), b(3) 返回 2,
r_7 = next(zzz) # 0 b(3) 无法在继续循环了,所以跳出循环,a() 内部的循环开始继续,即 i == 4 ,也就是 b(4), 首先返回 0
r_8 = next(zzz) # 1
r_9 = next(zzz) # 2
r_10 = next(zzz) # 3 # 为什么到3 就停止了呢?! 这是b() 可以返回的最大值。因为 a()是range(5) ,也就是说 i 最大为 4, 所以 b(t) 为 range(4) ,所以最大为 b() 可以返回的最大值是 3
r_11 = next(zzz) # StopIteration
yield from
后面必须接一个可迭代对象。其实,是把可迭代对象,嵌套到了主生成器那里,next
返回的是可迭代对象的结果