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 返回的是可迭代对象的结果

原文地址:https://www.cnblogs.com/jijizhazha/p/8352688.html