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在某时某刻的绑定关系,尤为重要
希望这篇博客能帮助你们!谢谢!轻点问候!
转载于:https://www.cnblogs.com/bosha/p/9344688.html
python生成器的惰性计算相关推荐
- python 迭代器和惰性计算、函数式编程基础
本文介绍了 python 的生成器,构造一些有趣的惰性计算程序,可以作为 python 函数式的基础. 1. iterator and generator 众所周知,python3 里面的 ran ...
- python yield 惰性计算,用于scrapy中(美食杰爬虫为例)
先说一下什么是python的惰性计算 惰性计算(Lazy evaluation)是指仅仅在真正需要执行的时候才计算表达式的值.充分利用其特性可以带来很多便利.yield的功能类似于return,但是不 ...
- Python 惰性计算
惰性计算(Lazy evaluation),是指仅仅在真正需要执行的时候才计算表达式的值.充分利用其特性可以带来很多便利. 避免不必要的计算,带来性能的提升. 对于Python中的条件表达式 if x ...
- python中生成器的惰性机制
生成器有一个惰性机制,只有当你需要的时候才给你(一个个的取),而不是一下字全部给你.可能有些抽象,来一个例子 吧. 普及一个小知识**:一只母鸡并不是生一辈子鸡蛋,有一个时间段.** 例:小明和小红两 ...
- Python:用生成器的方式计算任意起止范围内质数的和。
用生成器的方式计算任意起止范围内质数的和. (质数,又称素数,是大于 1 的自然数,除了 1 和它本身外,不能被其他自然数整除.) def judge(num):if num == 1:return ...
- Python生成器函数案例一则:理财收益计算
问题描述:假设理财利率不变,那么需要多少年才能使得投资翻倍? 技术要点:1)生成器函数:2)内置函数enumerate(). 参考代码: ----------喜大普奔---------- 1.董付国老 ...
- python 生成器 迭代器 yiled
文章来源:http://python.jobbole.com/81911/ https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449 ...
- 彻底理解Python生成器和迭代器
目录 1.列表生成式 2.生成器 3.迭代器 4.对yield的总结 5.补充:itertools库学习 1.列表生成式 首先举个例子 现在有个需求,看列表 [0,1,2,3,4,5,6,7,8,9] ...
- Python生成器与迭代器详细教程
一.列表生成器 首先举个例子 现在有个需求,看列表 [0,1,2,3,4,5,6,7,8,9],要求你把列表里面的每个值加1,你怎么实现呢? 方法一(简单): info = [0, 1, 2, 3, ...
- python生成器、迭代器、__call__、闭包简单说明
1.生成器 这种一边循环一边计算的机制,称为生成器:generator,最简单的方法是把生成式的[]改为(). >>> l=(x * x for x in range(1, 11) ...
最新文章
- The expression cannot be a selector(occur after a dot)下面是 what went wrong: Execution failed for task
- centos 7 ssh 安装mysql,Centos 7 安装Airflow
- cv2.fillConvexPoly填充多边形
- opencv 通过颜色提取显示屏数字
- tabBar颜色改动
- 用了这么多年的 Java 泛型,你对它到底有多了解?
- html5饼图的制作方法,html5制作饼图
- 2499元起!红米K20 Pro发布 吊打855友商旗舰?
- Vue—实例成员computed和watch
- artDialog双击会关闭对话框的修改
- Cocos2d-x 3.17.2 集成X5WebView内核方法,完美运行
- 水晶报表教程:手把手教你制作基本报表
- 计算机 管理 mmc 注册表,win10注册表编辑器没有mmc怎么办_win10恢复注册表mmc文件夹的方法-win7之家...
- 阿里云DDoS防护是如何工作的?
- 【玩转微信公众平台之二】 账号注册
- 论文阅读:(NFM)Neural Factorization Machines for Sparse Predictive Analytics
- 手把手教你用Arcgis绘制地图【热力图】
- 最常用计算机文件后缀名,文件扩展名/后缀名是什么 常用的文件扩展名大全
- git 本地仓添加多个远端仓库
- Bootstrap栅格布局分析grid源码
热门文章
- 80%的Oracle JDK用户正在寻找免费的替代品!!!
- Google 编程之夏:海量优质项目,丰厚报酬,你竟然还不知道?
- mysql基础之查询缓存、存储引擎
- iOS端im实时音视频功能快速开发实操指导!
- Python 的一些网络库(感谢Arbow)
- Android 2.3 版本中链接边框问题解决
- BABOK - BA计划和监控(BA Planning Monitoring)概要
- [Swift]LeetCode198. 打家劫舍 | House Robber
- React Mixin
- [转载]如何学习ANSYS?