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爬取读者并制作成PDF
Mar 10 Python
深入解析Python中的上下文管理器
Jun 28 Python
Python做简单的字符串匹配详解
Mar 21 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
Jul 06 Python
python利用正则表达式搜索单词示例代码
Sep 24 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
Dec 29 Python
新年快乐! python实现绚烂的烟花绽放效果
Jan 30 Python
Python 的AES加密与解密实现
Jul 09 Python
python 字符串常用函数详解
Sep 11 Python
selenium+headless chrome爬虫的实现示例
Jan 08 Python
pandas:get_dummies()与pd.factorize()的用法及区别说明
May 21 Python
Python简易开发之制作计算器
Apr 28 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
smarty模板嵌套之include与fetch性能测试
2010/12/05 PHP
PHP中array_merge和array相加的区别分析
2013/06/17 PHP
浅谈php://filter的妙用
2019/03/05 PHP
JQuery 常用操作代码
2010/03/14 Javascript
js返回上一页并刷新代码整理
2012/12/21 Javascript
浅谈JavaScript中的Math.atan()方法的使用
2015/06/14 Javascript
javascript实现跨域的方法汇总
2015/06/25 Javascript
js实现的页面矩阵图形变换特效
2016/01/26 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
javascript实现超好看的3D烟花特效
2020/01/01 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
2020/05/12 Javascript
Python全局变量用法实例分析
2016/07/19 Python
Python实现多线程抓取网页功能实例详解
2017/06/08 Python
Django实现快速分页的方法实例
2017/10/22 Python
python 定时修改数据库的示例代码
2018/04/08 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
2018/04/26 Python
Python文本统计功能之西游记用字统计操作示例
2018/05/07 Python
详解Python3除法之真除法、截断除法和下取整对比
2019/05/23 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
2019/12/19 Python
Anaconda的安装及其环境变量的配置详解
2020/04/22 Python
HTML5 Plus 实现手机APP拍照或相册选择图片上传功能
2016/07/13 HTML / CSS
自我评价格式
2014/01/06 职场文书
小学生读书感言
2014/02/12 职场文书
志愿者爱心公益活动策划方案
2014/09/15 职场文书
水利专业大学生职业生涯规划书范文
2014/09/17 职场文书
国庆节演讲稿范文2014
2014/09/19 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
幼儿园小班开学寄语
2015/05/27 职场文书
2015年学校教科室工作总结
2015/07/20 职场文书
2019军训心得体会
2019/06/27 职场文书
go:垃圾回收GC触发条件详解
2021/04/24 Golang
TV动画「神渣☆爱豆」公开第一弹主视觉图
2022/03/21 日漫
win11无法添加打印机怎么办? 提示windows无法打开添加打印机的解决办法
2022/04/05 数码科技
Python 的演示平台支持 WSGI 接口的应用
2022/04/20 Python