day12 Python 生成器推导式的坑
重要的事情说三遍!!!
生成器的惰性机制: ⽣成器只有在访问的时候才取值!!!
生成器的惰性机制: ⽣成器只有在访问的时候才取值!!!
生成器的惰性机制: ⽣成器只有在访问的时候才取值!!!
实例一
请问以下生成的三个生成器最后print的结果是多少?
def func(): print(111) yield 222 yield 333 g = func() # 生成-->⽣成器g g1 = (i for i in g) # 生成器g1. 但是g1的数据来源于g g2=(i for i in g1) # ⽣成器g2. 来源g1 print(list(g)) # 获取g中的数据. 这时func()才会被执行. 打印111.获取到222. g完毕. print(list(g1)) # 获取g1中的数据. g1的数据来源是g. 但是g已经取完了. g1 也就没有数据了 print(list(g2)) # 和g1同理 结果: ["222","333"] [] []
实例二
请问最后print的结果是?
def add(a, b): return a + b def test(): for r_i in range(4): # 0,1,2,3 yield r_i g = test() # 0,1,2,3 for n in [2, 10]: g = (add(n, i) for i in g) """ 此处要注意,此处g这个生成器表达式在循环的时候并没有调用,只在最后的print才调用了,此处可以理解为:循环的时候,生成器表达式并没有执行,第一次循环n2=的时候 g = (add(n, i) for i in g) 这个生成器表达式的代码没有执行只是拷贝到一块新的内存中,第二次循环的时候n=10,此时生成器表达式没有执行, g = (add(n, i) for i in g) 也拷贝到了内存中。当最后print的时候,n最后的值是10,然后开始执行生成器表达式中的代码。此时 g = (add(10,i) for i in (add(10,i) for i in g)); """ print(list(g)) # 结果: 20,21,22,23