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的迭代器和生成器使用实例
Jan 14 Python
解决Python requests 报错方法集锦
Mar 19 Python
Python编程实现双击更新所有已安装python模块的方法
Jun 05 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
Jun 14 Python
基于python元祖与字典与集合的粗浅认识
Aug 23 Python
Python smtplib实现发送邮件功能
May 22 Python
python脚本当作Linux中的服务启动实现方法
Jun 28 Python
python关于矩阵重复赋值覆盖问题的解决方法
Jul 19 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
Aug 22 Python
python二进制读写及特殊码同步实现详解
Oct 11 Python
Django实现从数据库中获取到的数据转换为dict
Mar 27 Python
python调用win32接口进行截图的示例
Nov 11 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
ThinkPHP自动验证失败的解决方法
2011/06/09 PHP
PHP输出时间差函数代码
2013/01/28 PHP
php实现粘贴截图并完成上传功能
2015/05/17 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
2017/05/02 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
layui数据表格自定义每页条数limit设置
2019/10/26 PHP
JObj预览一个JS的框架
2008/03/13 Javascript
JQuery通过Ajax提交表单并返回结果
2011/07/31 Javascript
使用JQuery和CSS模拟超链接的用户单击事件的实现代码
2012/05/23 Javascript
很不错的两款Bootstrap Icon图标选择组件
2016/01/28 Javascript
AngularJS入门教程之控制器详解
2016/07/27 Javascript
nodejs redis 发布订阅机制封装实现方法及实例代码
2016/12/15 NodeJs
ionic2 tabs 图标自定义实例
2017/03/08 Javascript
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
2017/11/27 Javascript
vue.js $refs和$emit 父子组件交互的方法
2017/12/20 Javascript
详解vue父子组件关于模态框状态的绑定方案
2019/06/05 Javascript
js canvas实现五子棋小游戏
2021/01/22 Javascript
Python break语句详解
2014/03/11 Python
以Flask为例讲解Python的框架的使用方法
2015/04/29 Python
python-opencv 将连续图片写成视频格式的方法
2019/01/08 Python
Python玩转Excel的读写改实例
2019/02/22 Python
浅谈python之高阶函数和匿名函数
2019/03/21 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
Python多进程multiprocessing、进程池用法实例分析
2020/03/24 Python
Python configparser模块操作代码实例
2020/06/08 Python
python中的django是做什么的
2020/07/31 Python
PyCharm 2020.2 安装详细教程
2020/09/25 Python
国际象棋商店:The Chess Store
2018/07/09 全球购物
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
班长岗位职责
2013/11/10 职场文书
财务专业大学生职业生涯规划范文
2013/12/30 职场文书
应届专科生个人的自我评价
2014/01/05 职场文书
体育之星事迹材料
2014/05/11 职场文书
运动会宣传稿100字
2015/07/23 职场文书
Vue3中的Refs和Ref详情
2021/11/11 Vue.js