浅谈Python中的闭包


Posted in Python onJuly 08, 2015

Python中的闭包的概念, 在我看来, 就相当于在某个函数中又定义了一个或多个函数, 内层函数定义了具体的实现方式, 而外层返回的就是这个实现方式, 但并没有执行, 除非外层函数调用的内层的实现方法被执行了。至于这个怎么执行, 看下面的例子就知道了

比如:

def sum_outer(x, y):
  def sum_in(z):
    return x + y - z;
  return sum_in #注意, 这里返回的不是sum_in() 只是sum_in的函数名

 m = sum_outer(3, 4) #3, 4 分别对应x, y,这里的m返回的也只是函数sum_in的定义,<function __main__.sum_in>
 print m(5) # m对应z, 这个时候才是真正sum_in执行的时候

看起来就像通过sum_outer 调用了内层的sum_in函数, 多了层代理

其中一种应用场景就是可以根据不同的参数,使用相同的实现去返回对应不同的结果,比如, 根据不同的配置获取不同的数据库连接, 或者要求在验证字符串长度时, 可以根据不同的最大长度验证(外层传递最大长度, 内层传递验证的字符串)。

在抽象化一点, 外层定义了一个环境, 内层则是在该环境中的要做的事情, 但这个事情还没做,
只是要做。当真正需要做的时候到这个环境中去做了就好了(外层的返回结果(m)执行内层的函数sum_in)
实际上, 直接给函数传递需要的所有参数, 直接返回结果, 如上面的sum_outer和sum_in, 直接通过

def sum(x,y,z):
  return x + y - z

不就结了吗,为社么还要闭包这个实现呢? 到目前来说, 只能看出他们是两种不同的实现方式, 更多的区别, 还有待日后的学习体验

以上所述就是本文的全部内容了,希望大家能够喜欢。

Python 相关文章推荐
在Linux下使用Python的matplotlib绘制数据图的教程
Jun 11 Python
python操作redis的方法
Jul 07 Python
利用python求解物理学中的双弹簧质能系统详解
Sep 29 Python
python中的计时器timeit的使用方法
Oct 20 Python
python numpy格式化打印的实例
May 14 Python
python如何解析配置文件并应用到项目中
Jun 27 Python
浅谈pycharm使用及设置方法
Sep 09 Python
matplotlib 对坐标的控制,加图例注释的操作
Apr 17 Python
解决python中import文件夹下面py文件报错问题
Jun 01 Python
python能做哪些生活有趣的事情
Sep 09 Python
Python制作简单的剪刀石头布游戏
Dec 10 Python
使用Python的开发框架Brownie部署以太坊智能合约
May 28 Python
Python中atexit模块的基本使用示例
Jul 08 #Python
python登录豆瓣并发帖的方法
Jul 08 #Python
python发送HTTP请求的方法小结
Jul 08 #Python
python友情链接检查方法
Jul 08 #Python
Python抓取百度查询结果的方法
Jul 08 #Python
Python抓取淘宝下拉框关键词的方法
Jul 08 #Python
Python根据区号生成手机号码的方法
Jul 08 #Python
You might like
BBS(php &amp; mysql)完整版(三)
2006/10/09 PHP
php控制linux服务器常用功能 关机 重启 开新站点等
2012/09/05 PHP
php检查字符串中是否包含7位GSM字符的方法
2015/03/17 PHP
php使用curl打开https网站的方法
2015/06/17 PHP
PHP中危险的file_put_contents函数详解
2017/11/04 PHP
PHP lcfirst()函数定义与用法
2019/03/08 PHP
javascript 支持链式调用的异步调用框架Async.Operation
2009/08/04 Javascript
JS实现div内部的文字或图片自动循环滚动代码
2013/04/19 Javascript
js自动查找select下拉的菜单并选择(示例代码)
2014/02/26 Javascript
JavaScript异步回调的Promise模式封装实例
2014/06/07 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
node.js中的fs.truncateSync方法使用说明
2014/12/15 Javascript
jQuery树形下拉菜单特效代码分享
2015/08/15 Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
2016/06/08 Javascript
获取select的value、text值的简单示例(jquery与javascript)
2016/12/07 Javascript
详解jQuery中的DOM操作
2016/12/23 Javascript
NodeJs下的测试框架Mocha的简单介绍
2017/02/22 NodeJs
js replace替换字符串同时替换多个方法
2018/11/27 Javascript
jquery的$().each和$.each的区别
2019/01/18 jQuery
PostgreSQL Node.js实现函数计算方法示例
2019/02/12 Javascript
JS中FileReader类实现文件上传及时预览功能
2020/03/27 Javascript
[02:57]2014DOTA2国际邀请赛 选手辛苦解说更辛苦
2014/07/10 DOTA
[01:14:41]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第一场 1月8日
2021/03/11 DOTA
Python实现的ini文件操作类分享
2014/11/20 Python
Python import自定义模块方法
2015/02/12 Python
python mysql 字段与关键字冲突的解决方式
2020/03/02 Python
Python中的__init__作用是什么
2020/06/09 Python
python中remove函数的踩坑记录
2021/01/04 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
2021/01/15 Python
全网最细 Python 格式化输出用法讲解(推荐)
2021/01/18 Python
Hertz荷兰:荷兰和全球租车
2018/01/07 全球购物
乌克兰香水和化妆品网站:Notino.ua
2018/03/26 全球购物
四风问题专项整治工作情况报告
2014/10/28 职场文书
毕业证明模板
2015/06/19 职场文书
关于golang高并发的实现与注意事项说明
2021/05/08 Golang
python异常中else的实例用法
2021/06/15 Python