zoukankan      html  css  js  c++  java
  • 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 返回的是可迭代对象的结果

  • 相关阅读:
    [翻译]关于堆和堆栈
    sql 字符+数值 混合排序 lcs
    证明DataReader分页的可行性 lcs
    谈谈我对小公司、大公司及个人成长的见解 lcs
    sina 通用js代码说明 lcs
    Linux系统下生成证书 https证书
    【转】51单片机外部中断的C51编程
    【转】如何建立个人网站
    【转】关于C51的中断编程[原创]
    【转】毫不费力:破解加密PDF文档就使用这两三招
  • 原文地址:https://www.cnblogs.com/jijizhazha/p/8352688.html
Copyright © 2011-2022 走看看