生成器的调用和定义
1 def add(a, b): # 普通求和函数 2 return a + b 3 4 5 def test(): # 生成器函数 6 for r in range(4): 7 yield r 8 9 10 g = test() 11 for n in [2,10]: 12 #生成器的定义出 # 仅仅是定义了2次生成器 13 g=(add(n,i) for i in g) 14 15 # 生成器的调用 16 print(list(g))
生成器的定义
1 for n in [2, 10]: 2 # 循环内只是定义了两次生成器, 并不会去执行他 3 # 等待调用的时候再去执行 4 # 调用的时候执行, 会去寻找变量n 5 # n已经被for循环到最后一个, n==10 6 7 # 第一次循环不会调用g, 只是定义了一个g生成器 8 # 第二次循环才会调用g 9 10 # 等调用g的时候, n已经循环两次=10 11 # 第一次调用g, g里面是0, 1, 2, 3(test函数产生) 12 # 第二次调用g, g里面是10+0, 10+1, 10+2, 10+3, 10+4 13 g = (add(n, i) for i in g) 14 print(list(g))
生成器的调用
1 ''' 2 第二次循环才会调用g 3 g=(add(n,i) for i in g) 4 首先调用第一个g创建第二个g 5 6 7 8 第一次调用g 9 第一个g: 0, 1, 2, 3 (test产生) 10 吧元素传入add, 11 n为10(循环最后的结果) 12 13 传入第二个g的元素是:(n+g) 14 10+0, 10+1, 10+2, 10+3 15 此时g的取值范围是(10~13) 16 17 18 19 20 第二次调用g: 21 首先调用上一个g生成器(10~13) 22 然后add(n=10, g=(10~13)) 23 此时g的取值范围是(20~23) 24 25 26 list强转g, 把g的元素取出 27 [20, 21, 22, 23] 28 29 30 '''