Python中的闭包详细介绍和实例


Posted in Python onNovember 21, 2014

一、闭包

来自wiki:

闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。

在一些语言中,在函数中定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。运行时,一旦外部的 函数被执行,一个闭包就形成了,闭包中包含了内部函数的代码,以及所需外部函数中的变量的引用。

闭包的用途:

因为闭包只有在被调用时才执行操作,所以它可以被用来定义控制结构。
多个函数可以使用一个相同的环境,这使得它们可以通过改变那个环境相互交流。

来自baidu百科:

闭包的价值在于可以作为函数对象 或者匿名函数,对于类型系统而言这就意味着不仅要表示数据还要表示代码。支持闭包的多数语言都将函数作为第一级对象,就是说这些函数可以存储到变量中、作为参数传递给其他函数,最重要的是能够被函数动态地创建和返回。

二、python中闭包

实例:

def make_counter():

    count = 0

    def counter():

        nonlocal count

        count += 1

        return count

    return counter

    

def make_counter_test():

  mc = make_counter()

  print(mc())

  print(mc())

  print(mc())

三、lamada

实例:

def f(x):

    return x**2
print f(4)
g = lambda x : x**2

print g(4)

Python中的lambda真的没有用武之地吗?其实不是的,至少我能想到的点,主要有:

1. 使用Python写一些执行脚本时,使用lambda可以省去定义函数的过程,让代码更加精简。
2. 对于一些抽象的,不会别的地方再复用的函数,有时候给函数起个名字也是个难题,使用lambda不需要考虑命名的问题。
3. 使用lambda在某些时候让代码更容易理解。

Python 相关文章推荐
python实现udp数据报传输的方法
Sep 26 Python
Python实现的监测服务器硬盘使用率脚本分享
Nov 07 Python
python3简单实现微信爬虫
Apr 09 Python
Python中使用支持向量机SVM实践
Dec 27 Python
分享一下Python数据分析常用的8款工具
Apr 29 Python
Sanic框架异常处理与中间件操作实例分析
Jul 16 Python
Python参数传递机制传值和传引用原理详解
May 22 Python
python dict乱码如何解决
Jun 07 Python
解决Django响应JsonResponse返回json格式数据报错问题
Aug 09 Python
Python selenium如何打包静态网页并下载
Aug 12 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
Jan 27 Python
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
Apr 05 Python
Python多线程同步Lock、RLock、Semaphore、Event实例
Nov 21 #Python
python多进程操作实例
Nov 21 #Python
Python多进程通信Queue、Pipe、Value、Array实例
Nov 21 #Python
Python多进程同步Lock、Semaphore、Event实例
Nov 21 #Python
Python multiprocessing.Manager介绍和实例(进程间共享数据)
Nov 21 #Python
Python pickle类库介绍(对象序列化和反序列化)
Nov 21 #Python
Python和perl实现批量对目录下电子书文件重命名的代码分享
Nov 21 #Python
You might like
php设计模式 Delegation(委托模式)
2011/06/26 PHP
基于php验证码函数的使用示例
2013/05/03 PHP
php实现在限定区域里自动调整字体大小的类实例
2015/04/02 PHP
深入了解PHP中的Array数组和foreach
2016/11/06 PHP
jquery ui dialog ie8出现滚动条的解决方法
2010/12/06 Javascript
电子商务网站上的常用的js放大镜效果
2011/12/08 Javascript
js jquery验证银行卡号信息正则学习
2013/01/21 Javascript
纯js写的分页表格数据为json串
2014/02/18 Javascript
javascript对象的使用和属性操作示例详解
2014/03/02 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
AngularJS内置指令
2015/02/04 Javascript
js实现人才网站职位选择功能的方法
2015/08/14 Javascript
servlet+jquery实现文件上传进度条示例代码
2017/01/25 Javascript
原生JS封装animate运动框架的实例
2017/10/12 Javascript
angularJS开发注意事项
2018/05/26 Javascript
JS使用对象的defineProperty进行变量监控操作示例
2019/02/02 Javascript
Vue项目总结之webpack常规打包优化方案
2019/06/06 Javascript
详解template标签用法(含vue中的用法总结)
2021/01/12 Vue.js
自己编程中遇到的Python错误和解决方法汇总整理
2015/06/03 Python
深入浅析python继承问题
2016/05/29 Python
Python冒泡排序注意要点实例详解
2016/09/09 Python
Python 如何访问外围作用域中的变量
2016/09/11 Python
Python编程实现控制cmd命令行显示颜色的方法示例
2017/08/14 Python
python使用 HTMLTestRunner.py生成测试报告
2017/10/20 Python
Python中矩阵创建和矩阵运算方法
2018/08/04 Python
python hbase读取数据发送kafka的方法
2018/12/27 Python
PHP笔试题
2012/02/22 面试题
医学生个人求职信范文
2014/02/07 职场文书
竞选演讲稿范文大全
2014/05/12 职场文书
电子商务系毕业生自荐信
2014/05/29 职场文书
写给女朋友的检讨书
2015/05/06 职场文书
2015年法务工作总结范文
2015/05/23 职场文书
廉洁自律证明
2015/06/24 职场文书
教师反邪教心得体会
2016/01/15 职场文书
JavaScript 中for/of,for/in 的详细介绍
2021/11/17 Javascript
Java 轮询锁使用时遇到问题
2022/05/11 Java/Android