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的几条建议分享
Feb 10 Python
python学习笔记:字典的使用示例详解
Jun 13 Python
Python创建文件和追加文件内容实例
Oct 21 Python
Python查找第n个子串的技巧分享
Jun 27 Python
python3中property使用方法详解
Apr 23 Python
使用Python做定时任务及时了解互联网动态
May 15 Python
python编程进阶之异常处理用法实例分析
Feb 21 Python
django执行数据库查询之后实现返回的结果集转json
Mar 31 Python
解决Python spyder显示不全df列和行的问题
Apr 20 Python
解决python父线程关闭后子线程不关闭问题
Apr 25 Python
Python 合并拼接字符串的方法
Jul 28 Python
如何利用python实现列表嵌套字典取值
Jun 10 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开发中常用的8个小技巧
2008/08/27 PHP
php文件操作实例代码
2012/05/10 PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
2014/08/08 PHP
PHP实现取得HTTP请求的原文
2014/08/18 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
Git命令之分支详解
2021/03/02 PHP
Jquery 组合form元素为json格式,asp.net反序列化
2009/07/09 Javascript
自制轻量级仿jQuery.boxy对话框插件代码
2010/10/26 Javascript
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
js截取小数点后几位的写法
2013/11/14 Javascript
js判断客户端是iOS还是Android等移动终端的方法
2013/12/11 Javascript
js中的preventDefault与stopPropagation详解
2014/01/29 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
vue.js通过自定义指令实现数据拉取更新的实现方法
2016/10/18 Javascript
微信小程序开发之录音机 音频播放 动画实例 (真机可用)
2016/12/08 Javascript
JavaScript实现多重继承的方法分析
2018/01/09 Javascript
vue实现搜索功能
2019/05/28 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
[01:08:30]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第一场 2月28日
2021/03/11 DOTA
python改变日志(logging)存放位置的示例
2014/03/27 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
Python判断变量是否为Json格式的字符串示例
2017/05/03 Python
使用k8s部署Django项目的方法步骤
2019/01/14 Python
如何利用Pyecharts可视化微信好友
2019/07/04 Python
python Elasticsearch索引建立和数据的上传详解
2019/08/04 Python
Django中的模型类设计及展示示例详解
2020/05/29 Python
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
巴西最大的巴士票务门户:Quero Passagem
2020/11/21 全球购物
劳资专员岗位职责
2013/12/27 职场文书
财务内勤岗位职责
2014/04/17 职场文书
劳动竞赛活动总结
2014/05/05 职场文书
《爬天都峰》教学反思
2016/02/23 职场文书
mysql连接查询中and与where的区别浅析
2021/07/01 MySQL
Java移除无效括号的方法实现
2021/08/07 Java/Android
5种方法告诉你如何使JavaScript 代码库更干净
2021/09/15 Javascript
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers