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实现的一个简单LRU cache
Sep 26 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
May 19 Python
python traceback捕获并打印异常的方法
Aug 31 Python
python实现弹跳小球
May 13 Python
python tkinter窗口最大化的实现
Jul 15 Python
Python实现微信小程序支付功能
Jul 25 Python
python3 下载网络图片代码实例
Aug 27 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
Dec 27 Python
python 项目目录结构设置
Feb 14 Python
python相对企业语言优势在哪
Jun 12 Python
python中的对数log函数表示及用法
Dec 09 Python
浅析Python中的随机采样和概率分布
Dec 06 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 定界符格式引起的错误
2011/05/24 PHP
php中$_POST与php://input的区别实例分析
2015/01/07 PHP
PHP编写RESTful接口的方法
2016/02/21 PHP
使用PHPMailer发送邮件实例
2017/02/15 PHP
js 字符串操作函数
2009/07/25 Javascript
jquery ajax 登录验证实现代码
2009/09/23 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
2011/03/25 Javascript
jQuery层次选择器选择元素使用介绍
2013/04/18 Javascript
通过js获取div的background-image属性
2013/10/15 Javascript
jquery增加时编辑jqGrid(实例代码)
2013/11/08 Javascript
extjs 分页使用jsp传递数据示例
2014/07/29 Javascript
JavaScript之Object类型介绍
2015/04/01 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
2016/05/10 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
2016/06/20 Javascript
Jquery实现上下移动和排序代码
2016/10/17 Javascript
jQuery插件FusionCharts绘制的3D饼状图效果实例【附demo源码下载】
2017/03/03 Javascript
js实现网页定位导航功能
2017/03/07 Javascript
JavaScript 基础表单验证示例(纯Js实现)
2017/07/20 Javascript
Javacript中自定义的map.js  的方法
2017/11/26 Javascript
vue 组件使用中的一些细节点
2018/04/25 Javascript
用Vue.js方法创建模板并使用多个模板合成
2019/06/28 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
2019/09/16 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
2020/10/22 Javascript
在实例中重学JavaScript事件循环
2020/12/03 Javascript
[41:20]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS DK
2014/05/26 DOTA
python遍历目录的方法小结
2016/04/28 Python
Python实现字符串与数组相互转换功能示例
2017/09/22 Python
python序列类型种类详解
2020/02/26 Python
Python使用type动态创建类操作示例
2020/02/29 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
2020/07/13 Python
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
CSS3 linear-gradient线性渐变生成加号和减号的方法
2017/11/21 HTML / CSS
教你使用Canvas处理图片的方法
2017/11/28 HTML / CSS
甜品蛋糕店创业计划书范文
2014/02/06 职场文书
初中生期末评语大全
2014/04/24 职场文书
端午节演讲稿
2014/05/23 职场文书