首页 > 编程语言 > 详细

python生成器的惰性计算

时间:2018-07-21 00:40:12      阅读:236      评论:0      收藏:0      [点我收藏+]

 

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

 

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

 

python生成器的惰性计算

原文:https://www.cnblogs.com/bosha/p/9344688.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!