下面展示一些 内联代码片
。
关于生成式问题的推导过程,我们要知道一个概念,生成器,在调用的时候才会执行,在形成的时候,只会将代码形成,不会运行
def add(l, i):
return l + i
def test():
for i in range(4):
yield i
g = test()
g= test()
for n in [10, 5000, 10]:
g = (add(n, i) for i in g)
print(list(g))
def add(l, i):
return I + i
def test():
fori in range(3):
yield i
g = test()
for n in [1, 5, 10]
g = (add(n, i) for i in g)
“”“
第一次循环:add(1, i) for i in g
第二次循环:add(5, i) for i in add(5, i) for i in g
第三次循环:add(10, i) for i in add(10, i) for i in add(10, i) for i in g
形成g生成器后得到:add(10, i) for i in add(10, i) for i in add(10, i) for i in g,只要调用:g == test(),生成器就会循环,执行得到 10,11,12
但是如果将(add(n, i) for i in g)是[add(n, i) for i in g],每次都打印:
1、第一次循环得到:add(1, i) for i in g——》 1,2,3
2、第二次循环得到:add(5, i) for i in g——》 此时g =1,2,3,得到6,7,8
3、第三次循环得到:add(10, i) for i in g——》 此时g =6,7,8得到16,17,18
”“”
print(list(g))
1、g = test() 运行赋值,这时test函数就在 yield 前面;
2、for n in [1, 5, 10]循环结束得到:add(n, i) for i in add(n, i) for i in add(n, i) for i in g,其中n,得到10
3、list(g)迭代调用,n==10,带入进入add(n, i) for i in add(n, i) for i in add(n, i) for i in g
4、第一次取值:得 30 :add(n, i) for i ing==20《———add(n, i) for i in g==10《———add(n, i) for i in g = 0
5、第二次取值:得 31 :add(n, i) for i ing==21《———add(n, i) for i in g==11《———add(n, i) for i in g = 1
6、第二次取值:得 32 :add(n, i) for i ing==22《———add(n, i) for i in g==12《———add(n, i) for i in g = 2
7、最后得到:30,31,31
8、如果(add(n, i) for i in g)是[add(n, i) for i in g],每次都取值得到:
[1, 2, 3]
[6, 7, 8]
[16, 17, 18]