python生成器的惰性计算
最近学习了python的迭代器和生成器,生成器的是有一个特点的,就是用到数据时才会去取来用!请观察下面代码思考问题,想明白了,你就会明白什么是惰性计算了!
1 def add(s, x): 2 return s + x 3 4 5 def gen(): 6 for i in range(4): 7 yield i 8 9 10 base = gen() 11 for n in [1, 10]: 12 base = (add(i, n) for i in base) 13 print(list(base))
输出:[20, 21, 22, 23] 很不解吧,请往下看
这个题的关键点在于下面几点:
1.因为循环在做的事是用生成器表达式生成数据,而生成器有个惰性计算特点,导致把我们引上一条不归路,我们被假象迷惑,其实它并没做任何事,而是单纯的走了两边过程
2.生成器就是等到用的(比如:打印或者next函数取值等)得时候才会进行计算生产,所以等到最后打印的时候才开始计算
3.当开始生产数据的时候,循环已经进行的两次n的值也因此变成了10
4.第一次循环生成器生产数用到的base还是绑定的gen取0,1,2,3经过加工(add函数加操作),生成器生产出10,11,12,13,然后base顺利占据了生成器
5.第二次循环在进行向base取值时,base已经不再是gen而是上次循环重新绑定的base,所以取到的值是10,11,12,13然后经过自己的加工生产出20,21,22,23,到这时大功告成。
6.千万别把 for n in [1,10] 想成了 for n in range (1,10)
7.可能n变成了10很意外,但是理解了惰性之后也就明白了为神魔n在为1时没进行运算
8.一定要理清base在某时某刻的绑定关系,尤为重要
希望这篇博客能帮助你们!谢谢!轻点问候!