生成器的调用和定义
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 '''