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 相关文章推荐
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
Feb 24 Python
在Python的setuptools框架下生成egg的教程
Apr 13 Python
Python使用微信SDK实现的微信支付功能示例
Jun 30 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
Nov 22 Python
为什么你还不懂得怎么使用Python协程
May 13 Python
使用Python实现跳帧截取视频帧
May 31 Python
Numpy中对向量、矩阵的使用详解
Oct 29 Python
Python super()函数使用及多重继承
May 06 Python
基于Python把网站域名解析成ip地址
May 25 Python
用Python 执行cmd命令
Dec 18 Python
20行代码教你用python给证件照换底色的方法示例
Feb 05 Python
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
Apr 27 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
第五节--克隆
2006/11/16 PHP
约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
2010/10/12 PHP
mcrypt启用 加密以及解密过程详细解析
2013/08/07 PHP
PHP中比较时间大小实例
2014/08/21 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
2017/05/09 PHP
laravel 中如何使用ajax和vue总结
2017/08/16 PHP
PHP7.3.10编译安装教程
2019/10/08 PHP
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
关于Mozilla浏览器不支持innerText的解决办法
2011/01/01 Javascript
jquery使用jquery.zclip插件复制对象的实例教程
2013/12/04 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
2014/06/24 Javascript
jQuery基于xml格式数据实现模糊查询及分页功能的方法
2016/12/25 Javascript
Bootstrap 模态框实例插件案例分析
2016/12/28 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
2017/02/14 Javascript
Nodejs进阶之服务端字符编解码和乱码处理
2017/09/04 NodeJs
Angular 容器部署的方法
2018/04/17 Javascript
在vue中使用echarts图表实例代码详解
2018/10/22 Javascript
Webpack设置环境变量的一些误区详解
2019/12/19 Javascript
解决vue 退出动画无效的问题
2020/08/09 Javascript
antd vue table跨行合并单元格,并且自定义内容实例
2020/10/28 Javascript
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
python mysqldb连接数据库
2009/03/16 Python
python的tkinter布局之简单的聊天窗口实现方法
2014/09/03 Python
keras训练浅层卷积网络并保存和加载模型实例
2020/07/02 Python
CSS3制作日历实现代码
2012/01/21 HTML / CSS
HTML5如何为形状图上颜色怎么绘制具有颜色和透明度的矩形
2014/06/23 HTML / CSS
中国网上药店领导者:1药网
2017/02/16 全球购物
美国牙科折扣计划:DentalPlans.com
2019/08/26 全球购物
美国用餐电影院:Alamo Drafthouse Cinema
2020/01/23 全球购物
任命书怎么写
2014/06/04 职场文书
鲁迅故里导游词
2015/02/05 职场文书
电影红河谷观后感
2015/06/11 职场文书
mysql查询结果实现多列拼接查询
2022/04/03 MySQL
java高级用法JNA强大的Memory和Pointer
2022/04/19 Java/Android