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多线程方式执行多个bat代码
Jun 07 Python
简单了解python模块概念
Jan 11 Python
Java与Python两大幸存者谁更胜一筹呢
Apr 12 Python
python中的tcp示例详解
Dec 09 Python
python实现定时发送qq消息
Jan 18 Python
Django封装交互接口代码
Jul 12 Python
Python学习笔记之装饰器
Aug 06 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
Aug 27 Python
Pytest单元测试框架如何实现参数化
Sep 05 Python
Python爬虫之Selenium实现关闭浏览器
Dec 04 Python
安装pytorch时报sslerror错误的解决方案
May 17 Python
python自动化测试之Selenium详解
Mar 13 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
关于Sphinx创建全文检索的索引介绍
2013/06/25 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
2016/03/18 PHP
JAVASCRIPT  THIS详解 面向对象
2009/03/25 Javascript
Angular中的Promise对象($q介绍)
2015/03/03 Javascript
JavaScript检查弹出窗口是否被阻拦的方法技巧
2015/03/13 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
2015/06/19 Javascript
在Ubuntu系统上安装Node.JS的教程
2015/10/15 Javascript
详解Bootstrap glyphicons字体图标
2016/01/04 Javascript
值得分享和收藏的xmlplus组件学习教程
2017/05/05 Javascript
angular中实现li或者某个元素点击变色的两种方法
2017/07/27 Javascript
layui的table中显示图片方法
2018/08/17 Javascript
ES6使用export和import实现模块化的方法
2018/09/10 Javascript
Egg.js 中 AJax 上传文件获取参数的方法
2018/10/10 Javascript
Vue动态生成el-checkbox点击无法赋值的解决方法
2019/02/21 Javascript
微信小程序传值以及获取值方法的详解
2019/04/29 Javascript
Element中Slider滑块的具体使用
2020/07/29 Javascript
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
python+matplotlib绘制饼图散点图实例代码
2018/01/20 Python
python正则表达式及使用正则表达式的例子
2018/01/22 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
Appium+Python自动化测试之运行App程序示例
2019/01/23 Python
numpy按列连接两个维数不同的数组方式
2019/12/06 Python
Pytorch之卷积层的使用详解
2019/12/31 Python
HTML5 实现一个访问本地文件的实例
2012/12/13 HTML / CSS
项目经理聘任书
2014/03/29 职场文书
支部鉴定材料
2014/06/02 职场文书
经济管理专业求职信
2014/06/09 职场文书
职工年度考核评语
2014/12/31 职场文书
幼儿园开学温馨提示
2015/07/15 职场文书
《藏戏》教学反思
2016/02/23 职场文书
小学一年级语文教学反思
2016/03/03 职场文书
手把手教你制定暑期学习计划,让你度过充实的暑假
2019/08/22 职场文书
南阳市白酒市场的调查报告
2019/11/08 职场文书
OpenCV-Python实现怀旧滤镜与连环画滤镜
2021/06/09 Python
图片批量处理 - 尺寸、格式、水印等
2022/03/07 杂记
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸