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使用pil生成缩略图的方法
Mar 26 Python
Python编码爬坑指南(必看)
Jun 10 Python
解决python3 urllib中urlopen报错的问题
Mar 25 Python
人机交互程序 python实现人机对话
Nov 14 Python
python爬虫爬取某站上海租房图片
Feb 04 Python
python 使用值来排序一个字典的方法
Nov 16 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
Jun 25 Python
python多线程共享变量的使用和效率方法
Jul 16 Python
Django中密码的加密、验密、解密操作
Dec 19 Python
python爬虫库scrapy简单使用实例详解
Feb 10 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
Dec 04 Python
python3 hdf5文件 遍历代码
May 19 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
2019年漫画销量排行榜:鬼灭登顶 海贼单卷制霸 尾田盛赞鬼灭
2020/03/08 日漫
IIS7.X配置PHP运行环境小结
2011/06/09 PHP
php判断对象是派生自哪个类的方法
2015/06/20 PHP
Laravel框架表单验证操作实例分析
2019/09/30 PHP
JS网络游戏-(模拟城市webgame)提供的一些例子下载
2007/10/14 Javascript
javascript修改表格背景色实例代码分享
2013/12/10 Javascript
JavaScript Serializer序列化时间处理示例
2014/07/31 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
2015/09/08 Javascript
深入解析JavaScript的闭包机制
2015/10/20 Javascript
jQuery Validate表单验证深入学习
2015/12/18 Javascript
4种JavaScript实现简单tab选项卡切换的方法
2016/01/06 Javascript
关于vue.js弹窗组件的知识点总结
2016/09/11 Javascript
一句jQuery代码实现返回顶部效果(简单实用)
2016/12/28 Javascript
bootstrap vue.js实现tab效果
2017/02/07 Javascript
xmlplus组件设计系列之下拉刷新(PullRefresh)(6)
2017/05/03 Javascript
js匿名函数使用&amp;传参(实例)
2017/09/08 Javascript
jQuery中实现text()的方法
2019/04/04 jQuery
vue 中使用 watch 出现了如下的报错的原因分析
2019/05/21 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
2019/09/18 Javascript
Vue点击切换Class变化,实现Active当前样式操作
2020/07/17 Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
2020/07/26 Javascript
跟老齐学Python之使用Python操作数据库(1)
2014/11/25 Python
python正则表达式及使用正则表达式的例子
2018/01/22 Python
python读取csv文件并把文件放入一个list中的实例讲解
2018/04/27 Python
python+opencv实现霍夫变换检测直线
2020/10/23 Python
python opencv判断图像是否为空的实例
2019/01/26 Python
python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)
2019/04/01 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
aws 通过boto3 python脚本打pach的实现方法
2020/05/10 Python
详解Python3 定义一个跨越多行的字符串的多种方法
2020/09/06 Python
基于Python采集爬取微信公众号历史数据
2020/11/27 Python
python os.listdir()乱码解决方案
2021/01/31 Python
英国领先的汽车轮胎和快速健康中心:Kwik Fit
2017/10/29 全球购物
镇副书记专题民主生活会对照检查材料思想汇报
2014/10/02 职场文书
党员教师群众路线个人整改措施
2014/10/28 职场文书
最新农村养殖致富:资金投入较低的创业项目有哪些?
2019/09/26 职场文书