作为一种编程语言特性,闭包得到了很多编程语言的支持,Python也不例外。所谓闭包,在Python中指的是携带一个或多个自由量的函数。闭包函数的自由量不是函数的参数,而是生成这个函数时的环境变量。一旦闭包生成了,自由变量会绑定在函数上,即使离开创造它的环境,自由量依旧有效。总结一下,闭包的概念有以下三个要点。

  • 闭包是一个函数
  • 闭包函数是由其他代码生成的
  • 闭包函数携带了生成环境的信息

有一个很好的例子可以帮助初学者理解闭包。我们知道,几乎所有的计算模块,比如Python内置的标准数学模块math,提供的对数函数只能计算以2为底、以e为底和以10为底的三种对数。

>>> import math
>>> math.log(math.e) # 返回以e为底e的对数
1.0
>>> math.log2(4) # 返回以2为底4的对数
2.0
>>> math.log10(1000) # 返回以10为底1000的对数
3.0

如果想要计算以a为底b的对数,则需要使用对数换底公式。

logab=log10blog10alog_ab=\frac{log_{10}b}{log_{10}a}loga​b=log10​alog10​b​

>>> def glog(b, a): # 返回以a为底b的对数return math.log(b)/math.log(a)>>> glog(25, 5) #  # 返回以5为底25的对数
2.0

我们固然可以像上面的代码那样定义一个函数glog(),计算以任意数为底的对数,但每次总要输入两个参数,和math模块的log()、log2()、log10()函数风格不一致。如果使用闭包,就能生成和math风格一致的对数函数。

>>> def log_factory(n): # 定义一个闭包生成函数def log_n(x): # 生成闭包return math.log(x)/math.log(n) # 闭包中携带了环境参数nreturn log_n # 返回闭包>>> log5 = log_factory(5) # 用闭包生成器生成闭包
>>> log7 = log_factory(7) # 用闭包生成器生成闭包
>>> log5(25) # 该闭包携带的自由量是5
2.0
>>> log7(49) # 该闭包携带的自由量是7
2.0

以上代码,首先设计了一个对数函数生成器log_factory(),输入一个整数n,就返回一个以n为底的对数函数。继而用这个生成器生成了两个闭包函数,一个名为log5,一个名为log7。最后验证一下,一切都和我们想象的完全一样。


本文引用的例子,选自我的新书《Python高手修炼之道》,书中类似的例子还有很多。该书今天已在京东和当当网正式上线预售,双十一期间优惠力度空前(优惠活动时间:11月9日~11月11日)。如果觉得这本书还不错,就不要错过时机。想要签名的同学,请关注公众号“Python作业辅导员”,回复“Python高手修炼之道”,即可收到如何购买签名版的说明。


渠道一:京东自营图书

  • 优惠活动时间:11月9日~11日


渠道二:当当自营图书

  • 活动时间:11月9日~11日


渠道三:作者签名

  • 关注公众号“Python作业辅导员”
  • 回复“Python高手修炼之道”,即可收到如何购买签名版的说明

价格和优惠措施以各平台实际发布为准。

理解Python闭包,这应该是最好的例子相关推荐

  1. 深入理解Python闭包概念

    闭包并不只是一个Python中的概念,在函数式编程语言中应用较为广泛.理解python中的闭包一方面是能够正确的使用闭包,另一方面可以好好体会和思考闭包的设计思想. 1.概念介绍 首先看一下维基上对闭 ...

  2. 一篇好的技术博文,快速让你通俗理解Python闭包!

    通俗理解闭包 先来看看什么是闭包吧 闭包是引用了自由变量的函数.这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外.所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合 ...

  3. 理解python闭包

    python中闭包详解 转自:https://zhuanlan.zhihu.com/p/341376218 前言 如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数. 闭 ...

  4. 五分钟带你理解python闭包(闭环)

    闭环是一种现象 要满足闭环需要达到三个条件: 1,外函数中定义了一个内函数 2,内函数中运用了外函数的局部变量 3,外函数的返回值是内函数的引用 话不多说,我接下来用一段代码让大家明白 def tex ...

  5. python作用域的理解-python中对变量的作用域LEGB、闭包、装饰器基本理解

    一.作用域 在Python程序中创建.改变.查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域.python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量 ...

  6. python 闭包理解与应用

    一.概念介绍 闭包并不只是一个python中的概念,在函数式编程语言中应用较为广泛.理解python中的闭包一方面是能够正确的使用闭包,另一方面可以好好体会和思考闭包的设计思想. 首先看一下维基上对闭 ...

  7. python装饰器-理解Python装饰器(Decorator)

    理解Python装饰器(Decorator) Python装饰器看起来类似Java中的注解,然鹅和注解并不相同,不过同样能够实现面向切面编程. 想要理解Python中的装饰器,不得不先理解闭包(clo ...

  8. python装饰器作用-理解python中的装饰器

    一 什么是装饰器? 正如其名,装饰器的作用是为已经存在的对象增加额外功能(装饰),由此可使已有函数在无需代码改动的情况下增加额外功能:装饰器的本质是嵌套的函数且返回函数对象,即闭包.有关闭包的概念,可 ...

  9. Python 闭包详解

    在函数编程中经常用到闭包.闭包是什么,它是怎么产生的及用来解决什么问题呢.给出字面的定义先:闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)(想想Erlang的外层函数传入一个 ...

  10. Python闭包与延迟绑定

    Python闭包 1.什么是闭包,闭包必须满足以下3个条件: 必须有一个内嵌函数 内嵌函数必须应用外部函数的变量 外部函数的返回值必须是内嵌函数 举个栗子 # 嵌套函数但不是闭包 def nested ...

最新文章

  1. 微信小程序多项选择器_微信小程序三级联动之多列选择器
  2. node--静态服务器
  3. 本文将向您展示如何在 Flutter 中编码/解码 JSON
  4. spring核心:bean工厂的装配 6
  5. 牛客题霸 NC24 删除有序链表中重复的元素-II
  6. Devexpress xaf针对某个用户登录后在面板中设置导航无效的解决方法
  7. cap理论具体含义_分布式系统:CAP 理论的前世今生
  8. HTML5新特性-自定义属性(data-set)
  9. 直接插入排序(Straight Insertion Sort)
  10. 单链表实现一元多项式相加_python面试系列 01如何实现单链表的逆序
  11. 解析Servlet/JSP会话跟踪机制
  12. dataframe 切片_NumPy中的ndarray与Pandas的Series和DataFrame之间的区别与转换
  13. 钣金编程软件Radan无人值守,自动排版功能
  14. 教你如何用bat程序给电脑清理缓存垃圾(普通版)
  15. Beego项目打包部署到Linux服务器
  16. 正确的配置Android开发环境-让你的C盘不在爆红
  17. OperationTrident游戏开发总结
  18. c语言内联int 21h,[X64内核]SMAP,SMEP
  19. 中学-知识与能力【5】
  20. window10虚拟机下载地址

热门文章

  1. Linux上安装gcc
  2. C语言练习——数据加密
  3. VC++ MFC 学习资料
  4. Java编程练习题(涉及循环,函数等)
  5. 处理App状态改变的策略
  6. Vue 使用 print.js 实现打印组件
  7. CANoe+Carmaker联合仿真测试
  8. 最详细的java思维导图
  9. 10行代码带你入门Windows编程
  10. 在线考试系统设计+源码