可能经常会有人问到python中的range和xrange有什么区别,你知道range是直接创建了一个列表,而xrange是创建了一个生成器,并且xrange非常适合当需要创建一个很大的列表的时候,因为这将带来很小的内存开销,而如果使用range则带来的系统开销不可想象。但其实这里还有一些可以扒的东西,就是惰性求值的思想。

没错,xrange用的就是惰性求值的思想。

什么是惰性求值

从维基百科上看解释,大概是这样:

惰性求值也叫延迟求值,顾名思义就是表达式不会在它被绑定到变量之后就立即求值,而是等用到时再求值。延迟求值的一个好处是能够建立可计算的无限列表而没有妨碍计算的无限循环或大小问题,

例如,我们可以建立一个斐波那契表达式,并且我们可以用这个表达式无穷的取这个数列中的值。上面提到的xrange,比如:

for i in xrange(999999999):

print i

那么程序执行xrange(999999999)的时候,会返回一个生成器,每当执行print i的时候,才会计算当前i的值。这正是“延迟求值”,迭代器仅仅在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。如果你把xrange换成range,那么一次就生成999999999估计够你的内存喝一壶了。

tips:在python3中,xrange被去掉了,但是同时也把range的实现变成了和xrange一样了,所以你可以在python3中放心的使用range。

惰性求值的小例子

对于python的列表表达式,一般是非惰性的,会直接生成结果列表:

print [x*x for x in xrange(5)]

我们执行上面的命令,会直接生成列表[0, 1, 4, 9, 16],但如果我们想让它成为惰性求值怎么办呢?可以这样:

print (x*x for x in xrange(5))

只需把中括号改为小括号,就会是一个生成器,上面代码打印出的是。

那么问题来了,我们怎么去访问生成器生成的对象呢?答案就是使用next()方法:

n= (x*x for x in xrange(5))

for i in range(6):

print n.next()

每次调用next()方法都会生成下一个值,直到抛出异常:

0

1

4

9

16

Traceback (most recent call last):

File "D:/pythonWorkspace/IocustTest/local.py", line 7, in

print n.next()

StopIteration

当我们再没有值可生成时,就抛出了StopIteration错误,所以我们可以捕获这个异常来终止next()方法的调用。

一个实例

我们在写代码时可能会有这种场景:

s1 = somewhatLongOperation1()

s2 = somewhatLongOperation2()

if condition:

return str(s1)+str(s2)

上面的代码片需要分别计算s1和s2,然后如果条件成立,再连接s1和s2。在python中,这个代码段的执行顺序是确定的,就是从上到下。我们的计算函数可能会需要较长的时间,那么能不能缩短这个时间呢?s1和s2的值能不能并行计算呢?可以,只要确保没有函数修改或依赖于全局变量,那么这两个函数是可以经过特殊处理并行执行的。但其实我们还可以优化,借用惰性求值的理念,直到确实需要计算s1和s2的时候再计算:

def concatenate(condition):

if condition:

s1 = somewhatLongOperation1()

s2 = somewhatLongOperation2()

return str(s1)+str(s2)

上面的代码一开始并不计算s1和s2,直到条件成立,必须要计算的时候才计算,这样改的话明显会提高程序的执行效率。

惰性求值有显著的优化潜力。我们完全可以像数学家面对代数表达式一样,可以消去一部分而完全不去运行它,重新调整代码段以求更高的效率。

python中and和or的惰性求值特点_python中的惰性求值相关推荐

  1. python 求导实现_python怎么实现函数求导

    python实现函数求导的方法是:1.利用sympy库中的symbols方法传入x和y变量:2.利用sympy库中的diff函数传入需要求导的函数即可返回求导之后的结果. python利用sympy库 ...

  2. python求导函数公式_python怎么实现函数求导

    python实现函数求导的方法是:1.利用sympy库中的symbols方法传入x和y变量:2.利用sympy库中的diff函数传入需要求导的函数即可返回求导之后的结果. python利用sympy库 ...

  3. python计算ks值 代码_python画KS图,求KS值

    ks计算公式 ks用来衡量以一定阈值选定二分类模型预测结果集,各分类命中各自组内比重的差值,某一刻阈值使得此差值最大,此刻的差值就是ks值,ks越大代表模型可以更多地命中某类标签,同时尽可能地错判另一 ...

  4. 在python中布尔类型的值包括_Python中布尔类型

    我们已经了解了Python支持布尔类型的数据,布尔类型只有True和False两种值,但是布尔类型有以下几种运算: 与运算:只有两个布尔值都为 True 时,计算结果才为 True. True and ...

  5. python求交点坐标_Python - 两圆相交求交点坐标

    Python - 两圆相交求交点坐标 Max.Bai 2016-05-16 Python - 两圆相交求交点坐标 三轴机械臂求坐标问题,其实转化为平面问题就是两圆相交求交点问题,交点算出来就可以用反三 ...

  6. python标准库math中用来实现上取整_python中取整

    向上取整 定义:大于或等于 x 的最大整数 math.ceil(x) 向上取整运算为Ceiling,用数学符号??表示 1 2 3 4 5 6>>> import math # py ...

  7. python中map函数返回值类型_Python中的map

    map函数会根据提供的函数对指定序列做映射. map函数的定义: map(function, sequence[, sequence, ...]) -> list 通过定义可以看到,这个函数的第 ...

  8. python中and和or的惰性求值特点_Python中的惰性评估

    一个名为python pattern和Wikipedia的github存储库告诉我们什么是惰性评估. 将expr的评估延迟到需要其值为止,并避免重复评估. python3中的cached_proper ...

  9. python求乘积内建函数_Python中的内建函数(Built_in Funtions)

    前言 在Python官方文档的标准库章节中,第一节是简介,第二节就是Built_in Functions,可见内建函数是Python标准库的重要组成部分,而有很多内建函数我们平时却很少用到或根本就不知 ...

最新文章

  1. DeepDive-信息抽取工具安装教程
  2. switch case 中定义变量
  3. 一位 CEO 对 CTO 技术领导力的期待是什么?
  4. ABAP-DOI技术的优化
  5. SAP Fiori Elements - fragment load roundtrip
  6. 《独家记忆》见面会高甜宠粉 张超现场解锁隐藏技能
  7. linux创建2g文件,创建一个2G的文件(Linux命令dd)
  8. 惠普m1216硒鼓清零步骤_hpm1213nf清零
  9. termux自动启动ssh
  10. 十行python代码定时给微信好友发送晚安,自动应答--python云舔狗
  11. 自我思考:世界观与方法论——关于做事方法,情商,智商,爱商的深入思索
  12. 语音转换成文字要怎么做呢?
  13. untiy UI的坐标转为屏幕坐标
  14. 子游戏下载一半重新下载
  15. 【材料整理】 -- DTI相关知识点
  16. excel模拟运算表
  17. iphone SLO-MO, TIME-LAPSE, VIDEO,PANO
  18. C# and VB.NET Comparison Cheat Sheet
  19. C++学习记录8:定义一个分数类Score和学生类Student
  20. CAN总线的终端电阻为什么常用120Ω?

热门文章

  1. 2007浙大复试上机考试题目1--最小长方形
  2. 从 JavaScript 属性描述器剖析 Vue.js 响应式视图
  3. eclipse 基础设置
  4. thinkphp学习笔记8—命名空间
  5. UITableView 编辑和删除行
  6. Mininet与真实网络链接的方法
  7. iOS开发--AVFoundation自定义相机
  8. UIAlertControl的使用对比与UIAlertView和UIActionSheet
  9. SUV 个人收藏汽车
  10. USACO SEC.1.3 No.3 Calf Flac