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 相关文章推荐
Pyramid将models.py文件的内容分布到多个文件的方法
Nov 27 Python
python中实现php的var_dump函数功能
Jan 21 Python
Python+django实现文件上传
Jan 17 Python
flask入门之表单的实现
Jul 18 Python
Python的matplotlib绘图如何修改背景颜色的实现
Jul 16 Python
pytorch自定义初始化权重的方法
Aug 17 Python
Python实现PyPDF2处理PDF文件的方法示例
Sep 25 Python
Python网络编程之使用TCP方式传输文件操作示例
Nov 01 Python
Python 面向对象之类class和对象基本用法示例
Feb 02 Python
pytorch 查看cuda 版本方式
Jun 23 Python
python使用matplotlib:subplot绘制多个子图的示例
Sep 24 Python
Django框架模板用法详解
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 模拟POST|GET操作实现代码
2010/07/20 PHP
php实现mysql事务处理的方法
2014/12/25 PHP
PHP中的日期时间处理利器实例(Carbon)
2017/06/09 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
PHP删除字符串中非字母数字字符方法总结
2019/01/20 PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
2019/07/12 PHP
实现JavaScript中继承的三种方式
2009/10/16 Javascript
javascript面向对象的方式实现的弹出层效果代码
2010/01/28 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
JavaScript不刷新实现浏览器的前进后退功能
2014/11/05 Javascript
拖动时防止选中
2017/02/03 Javascript
JavaScript循环_动力节点Java学院整理
2017/06/28 Javascript
jQuery Ajax向服务端传递数组参数值的实例代码
2017/09/03 jQuery
解决Vue打包之后文件路径出错的问题
2018/03/06 Javascript
vue+vuex+axios实现登录、注册页权限拦截
2018/03/09 Javascript
vue-cli 组件的导入与使用教程详解
2018/04/11 Javascript
node结合swig渲染摸板的方法
2018/04/11 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
基于React Native 0.52实现轮播图效果
2020/08/25 Javascript
Vue.js子组件向父组件通信的方法实例代码详解
2018/12/10 Javascript
JavaScript实现简单计算器功能
2019/12/19 Javascript
从0搭建vue-cli4脚手架
2020/06/17 Javascript
[03:09]DOTA2亚洲邀请赛 LGD战队出场宣传片
2015/02/07 DOTA
Python数据结构与算法之二叉树结构定义与遍历方法详解
2017/12/12 Python
python使用opencv按一定间隔截取视频帧
2018/03/06 Python
简单了解Python3里的一些新特性
2019/07/13 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
2019/08/31 Python
python查看数据类型的方法
2019/10/12 Python
详解python tkinter模块安装过程
2020/01/06 Python
实例讲解Python 迭代器与生成器
2020/07/08 Python
详解HTML5常用的语义化标签
2019/09/27 HTML / CSS
亿阳信通股份有限公司C#笔试题
2016/12/06 面试题
班级安全教育实施方案
2014/02/23 职场文书
铁路安全反思材料
2014/12/24 职场文书
2015年服务员个人工作总结
2015/05/27 职场文书
react如何快速设置文件路径别名
2021/04/28 Javascript