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

  • 相关阅读:
    LeetCode Path Sum II
    LeetCode Longest Palindromic Substring
    LeetCode Populating Next Right Pointers in Each Node II
    LeetCode Best Time to Buy and Sell Stock III
    LeetCode Binary Tree Maximum Path Sum
    LeetCode Find Peak Element
    LeetCode Maximum Product Subarray
    LeetCode Intersection of Two Linked Lists
    一天一个设计模式(1)——工厂模式
    PHP迭代器 Iterator
  • 原文地址:https://www.cnblogs.com/jijizhazha/p/8352688.html
Copyright © 2011-2022 走看看