生成器的特点,只能往后执行并只能取一边。
def demo(): for i in range(8): yield i g = demo() g1 = (i for i in g) g2 = (i for i in g1) print(list(g1)) print(list(g2))#g2打印出来为空,因为g1在第一取值时向g去遍历,并把值全部打印出来。当g2取值时,会向上找g要。但是g1已经把g取空了 .故为空,若是想要为不为空需要注释掉g1.
def add(n,i): return n + i def text(): for i in range(5): yield i g = text() for n in [1,10]: g = (add(n,i)for i in g) print(list(g))
分析:
1.add函数生成1~10个数:
2.text生成器遍历一个0~4的列表。
3.因为g是使用的生成器表达式,所以一直到最后调用时函数才开始执行。因为生成器的原因,一次只能去一个值,且只能保存一个值。当n=10时,此时g等于从10分别加上[1,5]构成一个新的列表[10,11,12,13,14].新的列表再与10进行for遍历相加,最后强制转换并输出。
在for循环套生成器的情况
将for循环拆解。例如:如果把上面的for循环改为[1,4,2]。
我可以用拆成下面这样:
n = 1 g = (add(n, i) for i in g) n = 4 g = (add(n, i) for i in g) n = 2 g = (add(n, i) for i in(add(n,i)for i in(add(n,i)for i in text())
因为生成器的原因,你最后就只剩下2了,最后我们打印的就是最后行代码。如此就很清晰了。