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 Web服务器Tornado使用小结
May 06 Python
Python中使用urllib2防止302跳转的代码例子
Jul 07 Python
Python中的is和id用法分析
Jan 26 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
Jul 04 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
Apr 17 Python
python顺序的读取文件夹下名称有序的文件方法
Jul 11 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
Jun 24 Python
Python用5行代码写一个自定义简单二维码
Oct 21 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
Oct 29 Python
python实现烟花小程序
Jan 30 Python
face++与python实现人脸识别签到(考勤)功能
Aug 28 Python
Python count函数使用方法实例解析
Mar 23 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引用计数器进行垃圾收集机制介绍
2012/09/19 PHP
PHP设计模式之装饰者模式代码实例
2015/05/11 PHP
Zend Framework动作控制器用法示例
2016/12/09 PHP
Laravel服务容器绑定的几种方法总结
2020/06/14 PHP
PHP加MySQL消息队列深入理解
2021/02/27 PHP
JavaScript 面向对象编程(2) 定义类
2010/05/18 Javascript
让mayfish支持mysqli数据库驱动的实现方法
2010/05/22 Javascript
js querySelector和getElementById通过id获取元素的区别
2012/04/20 Javascript
JavaScript将数字转换成大写中文的方法
2015/03/23 Javascript
JavaScript获取当前网页标题(title)的方法
2015/04/03 Javascript
JavaScript实现网页对象拖放功能的方法
2015/04/15 Javascript
JavaScript中的函数嵌套使用
2015/06/04 Javascript
jQuery代码实现表格中点击相应行变色功能
2016/05/09 Javascript
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
JS中动态创建元素的三种方法总结(推荐)
2016/10/20 Javascript
jQuery延迟执行的实现方法
2016/12/21 Javascript
微信小程序开发教程-手势解锁实例
2017/01/06 Javascript
Angular2环境搭建具体操作步骤(推荐)
2017/08/04 Javascript
Angular5中提取公共组件之radio list的实例代码
2018/07/10 Javascript
Vue如何使用混合Mixins和插件开发详解
2020/02/05 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
[16:43]Heroes19_剃刀(完美)
2014/10/31 DOTA
python实现根据ip地址反向查找主机名称的方法
2015/04/29 Python
Python连接MySQL并使用fetchall()方法过滤特殊字符
2016/03/13 Python
Python实现统计给定列表中指定数字出现次数的方法
2018/04/11 Python
Pandas DataFrame 取一行数据会得到Series的方法
2018/11/10 Python
Numpy 中的矩阵求逆实例
2019/08/26 Python
python 实现图片上传接口开发 并生成可以访问的图片url
2019/12/18 Python
详解基于Scrapy的IP代理池搭建
2020/09/29 Python
python温度转换华氏温度实现代码
2020/12/06 Python
化工机械应届生求职信
2013/11/04 职场文书
中学运动会广播稿
2014/01/19 职场文书
查摆问题自我剖析材料
2014/08/18 职场文书
日本读研:怎样写好一篇日本研究计划书?
2019/07/15 职场文书
导游词之广西漓江
2019/11/02 职场文书
多台电脑共享文件怎么设置?多台电脑共享文件操作教程
2022/04/08 数码科技