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

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

转载于:https://www.cnblogs.com/bosha/p/9344688.html

python生成器的惰性计算相关推荐

  1. python 迭代器和惰性计算、函数式编程基础

    本文介绍了 python 的生成器,构造一些有趣的惰性计算程序,可以作为 python 函数式的基础. 1. iterator and generator ​ 众所周知,python3 里面的 ran ...

  2. python yield 惰性计算,用于scrapy中(美食杰爬虫为例)

    先说一下什么是python的惰性计算 惰性计算(Lazy evaluation)是指仅仅在真正需要执行的时候才计算表达式的值.充分利用其特性可以带来很多便利.yield的功能类似于return,但是不 ...

  3. Python 惰性计算

    惰性计算(Lazy evaluation),是指仅仅在真正需要执行的时候才计算表达式的值.充分利用其特性可以带来很多便利. 避免不必要的计算,带来性能的提升. 对于Python中的条件表达式 if x ...

  4. python中生成器的惰性机制

    生成器有一个惰性机制,只有当你需要的时候才给你(一个个的取),而不是一下字全部给你.可能有些抽象,来一个例子 吧. 普及一个小知识**:一只母鸡并不是生一辈子鸡蛋,有一个时间段.** 例:小明和小红两 ...

  5. Python:用生成器的方式计算任意起止范围内质数的和。

    用生成器的方式计算任意起止范围内质数的和. (质数,又称素数,是大于 1 的自然数,除了 1 和它本身外,不能被其他自然数整除.) def judge(num):if num == 1:return ...

  6. Python生成器函数案例一则:理财收益计算

    问题描述:假设理财利率不变,那么需要多少年才能使得投资翻倍? 技术要点:1)生成器函数:2)内置函数enumerate(). 参考代码: ----------喜大普奔---------- 1.董付国老 ...

  7. python 生成器 迭代器 yiled

    文章来源:http://python.jobbole.com/81911/ https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449 ...

  8. 彻底理解Python生成器和迭代器

    目录 1.列表生成式 2.生成器 3.迭代器 4.对yield的总结 5.补充:itertools库学习 1.列表生成式 首先举个例子 现在有个需求,看列表 [0,1,2,3,4,5,6,7,8,9] ...

  9. Python生成器与迭代器详细教程

    一.列表生成器 首先举个例子 现在有个需求,看列表 [0,1,2,3,4,5,6,7,8,9],要求你把列表里面的每个值加1,你怎么实现呢? 方法一(简单): info = [0, 1, 2, 3, ...

  10. python生成器、迭代器、__call__、闭包简单说明

    1.生成器 这种一边循环一边计算的机制,称为生成器:generator,最简单的方法是把生成式的[]改为(). >>> l=(x * x for x in range(1, 11) ...

最新文章

  1. The expression cannot be a selector(occur after a dot)下面是 what went wrong: Execution failed for task
  2. centos 7 ssh 安装mysql,Centos 7 安装Airflow
  3. cv2.fillConvexPoly填充多边形
  4. opencv 通过颜色提取显示屏数字
  5. tabBar颜色改动
  6. 用了这么多年的 Java 泛型,你对它到底有多了解?
  7. html5饼图的制作方法,html5制作饼图
  8. 2499元起!红米K20 Pro发布 吊打855友商旗舰?
  9. Vue—实例成员computed和watch
  10. artDialog双击会关闭对话框的修改
  11. Cocos2d-x 3.17.2 集成X5WebView内核方法,完美运行
  12. 水晶报表教程:手把手教你制作基本报表
  13. 计算机 管理 mmc 注册表,win10注册表编辑器没有mmc怎么办_win10恢复注册表mmc文件夹的方法-win7之家...
  14. 阿里云DDoS防护是如何工作的?
  15. 【玩转微信公众平台之二】 账号注册
  16. 论文阅读:(NFM)Neural Factorization Machines for Sparse Predictive Analytics
  17. 手把手教你用Arcgis绘制地图【热力图】
  18. 最常用计算机文件后缀名,文件扩展名/后缀名是什么 常用的文件扩展名大全
  19. git 本地仓添加多个远端仓库
  20. Bootstrap栅格布局分析grid源码

热门文章

  1. 80%的Oracle JDK用户正在寻找免费的替代品!!!
  2. Google 编程之夏:海量优质项目,丰厚报酬,你竟然还不知道?
  3. mysql基础之查询缓存、存储引擎
  4. iOS端im实时音视频功能快速开发实操指导!
  5. Python 的一些网络库(感谢Arbow)
  6. Android 2.3 版本中链接边框问题解决
  7. BABOK - BA计划和监控(BA Planning Monitoring)概要
  8. [Swift]LeetCode198. 打家劫舍 | House Robber
  9. React Mixin
  10. [转载]如何学习ANSYS?