浅谈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 相关文章推荐
python中wx将图标显示在右下角的脚本代码
Mar 08 Python
跟老齐学Python之不要红头文件(2)
Sep 28 Python
Python将多个list合并为1个list的方法
Jun 27 Python
python的scikit-learn将特征转成one-hot特征的方法
Jul 10 Python
Python函数定义及传参方式详解(4种)
Mar 18 Python
Python如何在DataFrame增加数值
Feb 14 Python
Python读取表格类型文件代码实例
Feb 17 Python
python中有函数重载吗
May 28 Python
pytorch随机采样操作SubsetRandomSampler()
Jul 07 Python
Python logging模块原理解析及应用
Aug 13 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
Nov 12 Python
浅析python字符串前加r、f、u、l 的区别
Jan 24 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
咖啡因含量是由谁决定的?低因咖啡怎么来?低因咖啡适合什么人喝
2021/03/06 新手入门
destoon切换城市后实现logo旁边显示地区名称的方法
2014/08/21 PHP
PHP中使用BigMap实例
2015/03/30 PHP
PHP队列场景以及实现代码实例详解
2021/02/26 PHP
用JS实现一个页面多个css样式实现
2008/05/29 Javascript
return false;和e.preventDefault();的区别
2010/07/11 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2014/07/21 Javascript
浅谈JS闭包中的循环绑定处理程序
2014/11/09 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
2016/05/30 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
jquery ui sortable拖拽后保存位置
2017/04/27 jQuery
Vue如何从1.0迁移到2.0
2017/10/19 Javascript
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
karma+webpack搭建vue单元测试环境的方法示例
2018/05/24 Javascript
React 组件中的 bind(this)示例代码
2018/09/16 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
vue:el-input输入时限制输入的类型操作
2020/08/05 Javascript
vue $router和$route的区别详解
2020/12/02 Vue.js
[01:32:22]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第一场 2月5日
2021/03/11 DOTA
Python内存读写操作示例
2018/07/18 Python
利用Python如何批量更新服务器文件
2018/07/29 Python
python paramiko利用sftp上传目录到远程的实例
2019/01/03 Python
python使用adbapi实现MySQL数据库的异步存储
2019/03/19 Python
python中加背景音乐如何操作
2020/07/19 Python
Django REST Framework 分页(Pagination)详解
2020/11/30 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
2021/01/15 Python
纯HTML5+CSS3制作生日蛋糕(代码易懂)
2016/11/16 HTML / CSS
加拿大廉价机票预订网站:CheapOair.ca
2018/03/04 全球购物
巴西网上药店:Drogaria Araujo
2021/01/06 全球购物
2016年度优秀辅导员事迹材料
2016/02/26 职场文书
MySQL基础(一)
2021/04/05 MySQL
MongoDB使用profile分析慢查询的步骤
2021/04/30 MongoDB
Java练习之潜艇小游戏的实现
2022/03/16 Java/Android
Java由浅入深通关抽象类与接口(上篇)
2022/04/26 Java/Android