码迷,mamicode.com
首页 > 编程语言 > 详细

python生成器的惰性计算

时间:2018-07-21 00:49:02      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:size   就是   博客   生成   gen   range   理解   生产   技术分享   

 

最近学习了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生成器的惰性计算

标签:size   就是   博客   生成   gen   range   理解   生产   技术分享   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!