Python 惰性求值,函数式编程高效,原因之一是将计算推迟到需要的时候进行。惰性(也称“非严格”)求值非常重要,Python内置了对它的支持。

Python中,逻辑运算符and、or和if-then-else都是非严格的。有时也称之为“短路”运算符,因为它们不需要计算全部参数就能得到最终结果。

以下命令片断展示了and运算符的惰性求值特性。

执行上面的代码时,如果and运算符左边的表达式值为False,不会对右边的表达式求值;只有当左边的表达式值为True时,才会对右边的表达式求值。

除此之外,Python使用严格求值规则。除了逻辑运算符,表达式都是严格地从左向右求值的。一组语句也是严格按顺序求值的,列表字面量和元组亦然。

当创建一个类时,它的各个方法是严格按顺序定义的。在类的定义中,所有方法在创建之后(默认)被放入一个字典,并不会保持之前的顺序。如果在一个类中创建两个名字相同的方法,那么由于严格的求值顺序,只会保留后面的方法,前面定义的方法会被覆盖掉。

Python的生成器表达式和生成器函数是惰性的,在求值时,这些表达式不会马上计算出所有的可能结果。如果不把计算过程显式打印出来,很难看到惰性求值的结果。下面的例子演示了通过引入带有副作用的range()函数生成值的过程。

每生成一个值,该函数就将其打印出来,以此给出调试提示。如果这个函数是严格求值的,将会打印出所有1024个值,但由于它是惰性的,所以只会按需生成值。

Python 2的range()函数是严格求值的,创建后就会生成所有包含的值。Python 3的range()函数是惰性求值的,不会创建大型数据结构。

可以用惰性求值的方式使用这个带日志功能的numbers()函数。下面编写一个只求部分值(而非全部)的函数。

sum_to()函数的类型提示表明它接收整型值作为参数,并返回整型值。sum变量也使用了Python 3语法::int,表明它是一个整型值。sum_to()函数不对numbers()函数取所有值,在取了前几个值后,就通过break语句退出了。下面的日志展示了numbers()创建值的方式。

后面会讲到,Python生成器函数的一些特点使得它在应用于简单函数时会出现一些小麻烦,例如一个生成器只能用一次,因此在使用Python的惰性生成器表达式时要小心。

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

  1. Python语言学习:在python中,如何获取变量的本身字符串名字而非其值/内容及其应用(在代码中如何查找同值的所有变量名)

    Python语言学习:在python中,如何获取变量的本身字符串名字而非其值/内容及其应用(在代码中如何查找同值的所有变量名) 目录

  2. python中整数类型的表示需加引导符号_Python内置类型及常见问题

    python的内置数据类型非常丰富,大致可以分为五类:None.数字类型.序列类型.映射类型和集合类型.下面我将分别对他们进行介绍,做个总结以备以后查看.下面的表列出了各个类别下的具体数据类型.*注: ...

  3. python求次幂_python如何求次幂?

    python中可以使用math模块中的pow()方法求次幂.pow() 方法返回xy(x的y次方)的值. math 模块 pow() 方法的语法:import math math.pow( x, y ...

  4. python中的变量是动态类型的什么意思_Python零基础入门(一):对Python的简单认识...

    点击蓝字 关注浅韵 一起划水 写在前面 期末考试告一段落之后,这个公众号又活了. 漫长的假期,想玩也是肯定的,但是发现自己想学的东西也很多,想写的东西也很多,所以给自己来了一个假期整活计划. 在这个假 ...

  5. 在python中、如果异常并未被处理或捕捉_python异常处理(一)

    Python的异常处理能力是很强大的,可向用户准确反馈出错信息.在Python中,异常也是对象,可对它进行操作.所有异常都是基类Exception的成员.所有异常都从基类Exception继承,而且都 ...

  6. python中的单下划线和双下划线_python中的单下划线和双下划线

    1. _ 的含义在python的类中,没有真正的私有化,不管是方法还是属性,为了编程的需要,约定加了下划线 _ 的属性和方法不属于API,不应该在类的外面访问,也不会被from M import * ...

  7. python中、变量指向的对象可以发生变化吗_python中的引用传递,可变对象,不可变对象,list注意点...

    python中的引用传递 首先必须理解的是,python中一切的传递都是引用(地址),无论是赋值还是函数调用,不存在值传递. 可变对象和不可变对象 python变量保存的是对象的引用,这个引用指向堆内 ...

  8. python中的列表和元组_百度资讯搜索_python中的列表和元组

    腾讯网 11小时前# 元组(tuple)是 Python 中另一个重要的序列结构,和列表类似,元组也是由一系列按特定顺序排序的元素组成.元组是一个有序列表,序列中的每个元素都分配一个数字(...百度快 ...

  9. 在python中、如果异常并未被处理或捕捉_Python异常处理总结

    本文较为详细的罗列了Python常见的异常处理,供大家参考,具体如下: 1. 抛出异常和自定义异常 Python用异常对象(exception object)表示异常情况,遇到错误后,会引发异常.如果 ...

最新文章

  1. [转载]分享WCF聊天程序--WCFChat
  2. 安装完成ubuntu系统后的基本的相关配置---Linux总结笔记
  3. 使用Spring @Transactional进行数据源路由
  4. Java多线程系列(十一):ReentrantReadWriteLock的实现原理与锁获取详解
  5. 阿里P8高级架构师教你如何通过BAT面试顺利拿到offer
  6. python计算区间内偶数和_Python 计算当真因子个数为偶数个时为幸运数,计算区间内幸运数之和...
  7. 将一个列表的奇数列赋值到另外一个列表
  8. 53 - leetcode 1. 两数之和 数据结构map类
  9. java bootstrapcache_使用ehcache持久化数据到磁盘 并且在应用服务器重启后不丢失数据...
  10. maven项目动态替换配置中的值
  11. PHP控制网页过期时间的代码!
  12. oledb驱动Oracle,Oracle学习笔记:手工注册oracle的oledb驱动 | 学步园
  13. 完全数(Perfect Number)
  14. 静态库和动态库的区别
  15. 使用SQL语句在K3里进行反结帐- -
  16. YOLOv1的pytorch复现版本,博主亲自测试完整复现。
  17. 每当这些游戏发售,各国旅游部门就笑得合不拢嘴了
  18. 【Ranger】编译问题An Ant BuildException has occured: exec returned: 1
  19. 程序员写程序的逻辑思维,和外行人想当然的思维,到底有什么不同
  20. python学习——廖雪峰网站

热门文章

  1. 麻省理工公开课人工智能笔记六
  2. 3年过去了!翟天临的微博又被写论文的研究生们喷了个底朝天...
  3. 傅里叶变换、拉普拉斯变换、z变换之间的联系
  4. linux云计算工程师百度百科,广州学习linux云计算工程师
  5. 洛谷-P3975 弦论(后缀自动机板子题)
  6. STM32F107的SPI3不能使用的问题
  7. TSCH协议及WIA-PA系统芯片
  8. [轉]ERP系统之比较——SAP、Oracle、BAAN、JDE、SSA
  9. Compact Multi-Signatures for Smaller Blockchains学习笔记
  10. python学习---画3d曲线曲面图