导航

面试_生成器的调用和定义

Posted on 2019-03-29 22:25  菜花教授  阅读(149)  评论(0编辑  收藏  举报

生成器的调用和定义

 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 '''