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在某时某刻的绑定关系,尤为重要

 

希望这篇博客能帮助你们!谢谢!轻点问候!

 

posted @ 2018-07-21 00:00  搏鲨  阅读(1219)  评论(4编辑  收藏  举报