python中的闭包用法实例详解


Posted in Python onMay 05, 2015

本文实例讲述了python中的闭包用法。分享给大家供大家参考。具体分析如下:

什么是闭包?

简单说,闭包就是根据不同的配置信息得到不同的结果

再来看看专业的解释:闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。

python实例:

看概念总是让人摸不着头脑,看几个python小例子就会了

例1

def make_adder(addend):
  def adder(augend):
    return augend + addend
  return adder
p = make_adder(23)
q = make_adder(44)
print p(100)
print q(100)

运行结果:

123
144

分析一下:

我们发现,make_adder是一个函数,包括一个参数addend,比较特殊的地方是这个函数里面又定义了一个新函数,这个新函数里面的一个变量正好是外部make_adder的参数.也就是说,外部传递过来的addend参数已经和adder函数绑定到一起了,形成了一个新函数,我们可以把addend看做新函数的一个配置信息,配置信息不同,函数的功能就不一样了,也就是能得到定制之后的函数.

再看看运行结果,我们发现,虽然p和q都是make_adder生成的,但是因为配置参数不同,后面再执行相同参数的函数后得到了不同的结果.这就是闭包.

例2

def hellocounter (name):
  count=[0] 
  def counter():
    count[0]+=1
    print 'Hello,',name,',',str(count[0])+' access!'
  return counter
hello = hellocounter('ma6174')
hello()
hello()
hello()

执行结果

Hello, ysisl , 1 access!
Hello, ysisl , 2 access!
Hello, ysisl , 3 access!

分析一下

这个程序比较有趣,我们可以把这个程序看做统计一个函数调用次数的函数.count[0]可以看做一个计数器,没执行一次hello函数,count[0]的值就加1。也许你会有疑问:为什么不直接写count而用一个列表?这是python2的一个bug,如果不用列表的话,会报这样一个错误:

UnboundLocalError: local variable 'count' referenced before assignment.

什么意思?就是说conut这个变量你没有定义就直接引用了,我不知道这是个什么东西,程序就崩溃了.于是,再python3里面,引入了一个关键字:nonlocal,这个关键字是干什么的?就是告诉python程序,我的这个count变量是再外部定义的,你去外面找吧.然后python就去外层函数找,然后就找到了count=0这个定义和赋值,程序就能正常执行了.

python3 代码

def hellocounter (name):
  count=0 
  def counter():
    nonlocal count
    count+=1
    print 'Hello,',name,',',str(count[0])+' access!'
  return counter
hello = hellocounter('ma6174')
hello()
hello()
hello()

例3

def makebold(fn):
  def wrapped():
    return "<b>" + fn() + "</b>"
  return wrapped
def makeitalic(fn):
  def wrapped():
    return "<i>" + fn() + "</i>"
  return wrapped
@makebold
@makeitalic
def hello():
  return "hello world"
print hello()

执行结果

<b><i>hello world</i></b>

简单分析

怎么样?这个程序熟悉吗?这不是传说的的装饰器吗?对,这就是装饰器,其实,装饰器就是一种闭包,我们再回想一下装饰器的概念:对函数(参数,返回值等)进行加工处理,生成一个功能增强版的一个函数。再看看闭包的概念,这个增强版的函数不就是我们配置之后的函数吗?区别在于,装饰器的参数是一个函数或类,专门对类或函数进行加工处理。

python里面的好多高级功能,比如装饰器,生成器,列表推到,闭包,匿名函数等,开发中用一下,可能会达到事半功倍的效果!

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
Python实现的tab文件操作类分享
Nov 20 Python
python实现网站的模拟登录
Jan 04 Python
python中WSGI是什么,Python应用WSGI详解
Nov 24 Python
django 多数据库配置教程
May 30 Python
Django CSRF跨站请求伪造防护过程解析
Jul 31 Python
python异常触发及自定义异常类解析
Aug 06 Python
python 中的paramiko模块简介及安装过程
Feb 29 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
Jun 15 Python
利用python爬取有道词典的方法
Dec 08 Python
python+selenium实现12306模拟登录的步骤
Jan 21 Python
如何用 Python 制作 GitHub 消息助手
Feb 20 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
Feb 24 Python
Python闭包实现计数器的方法
May 05 #Python
深入探究Python中变量的拷贝和作用域问题
May 05 #Python
Python使用metaclass实现Singleton模式的方法
May 05 #Python
python中查看变量内存地址的方法
May 05 #Python
Python中统计函数运行耗时的方法
May 05 #Python
Python调用命令行进度条的方法
May 05 #Python
Python记录详细调用堆栈日志的方法
May 05 #Python
You might like
php中记录用户访问过的产品,在cookie记录产品id,id取得产品信息
2011/05/04 PHP
PHP使用Pear发送邮件(Windows环境)
2016/01/05 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
2016/09/23 PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
2017/03/14 PHP
读jQuery之九 一些瑕疵说明
2011/06/21 Javascript
关闭时刷新父窗口两种方法
2014/05/07 Javascript
推荐4个原生javascript常用的函数
2015/01/12 Javascript
javascript中使用new与不使用实例化对象的区别
2015/06/22 Javascript
javascript实现倒计时(精确到秒)
2015/06/26 Javascript
javascript实现简单的分页特效
2015/08/12 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
原生js实现class的添加和删除简单代码
2016/07/12 Javascript
jQuery查找节点并获取节点属性的方法
2016/09/09 Javascript
实例分析浏览器中“JavaScript解析器”的工作原理
2016/12/12 Javascript
JavaScript实现的浏览器下载文件的方法
2017/08/09 Javascript
浅谈Vuex的状态管理(全家桶)
2017/11/04 Javascript
vue项目中引入vue-datepicker插件的详解
2019/05/14 Javascript
小程序云开发之用户注册登录
2019/05/18 Javascript
微信小程序中插入激励视频广告并获取收益(实例代码)
2019/12/06 Javascript
javascript实现前端分页功能
2020/11/26 Javascript
python中二维阵列的变换实例
2014/10/09 Python
浅析Python的Django框架中的Memcached
2015/07/23 Python
Python实现简单遗传算法(SGA)
2018/01/29 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
python导入坐标点的具体操作
2019/05/10 Python
将python安装信息加入注册表的示例
2019/11/20 Python
简单了解python元组tuple相关原理
2019/12/02 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
2020/03/30 Python
python实现学生通讯录管理系统
2021/02/25 Python
英国在线发型和美容产品商店:Beauty Cutie
2019/04/27 全球购物
Linux文件操作命令都有哪些
2015/02/27 面试题
IT工程师岗位职责
2014/07/04 职场文书
服务员态度差检讨书
2014/10/28 职场文书
2019年汽车租赁合同范本!
2019/08/12 职场文书
python 如何将两个实数矩阵合并为一个复数矩阵
2021/05/19 Python
Spring Boot项目如何优雅实现Excel导入与导出功能
2022/06/10 Java/Android