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调用shell的方法
Nov 20 Python
python实现统计代码行数的方法
May 22 Python
详解Python的Django框架中inclusion_tag的使用
Jul 21 Python
Python实现两款计算器功能示例
Dec 19 Python
一篇文章读懂Python赋值与拷贝
Apr 19 Python
python简易远程控制单线程版
Jun 20 Python
OpenCV+python手势识别框架和实例讲解
Aug 03 Python
编写多线程Python服务器 最适合基础
Sep 14 Python
浅谈python写入大量文件的问题
Nov 09 Python
浅析python表达式4+0.5值的数据类型
Feb 26 Python
Django 删除upload_to文件的步骤
Mar 30 Python
让你相见恨晚的十个Python骚操作
Nov 18 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
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
php,ajax实现分页
2008/03/27 PHP
php实现html标签闭合检测与修复方法
2015/07/09 PHP
Symfony学习十分钟入门经典教程
2016/02/03 PHP
Symfony核心类概述
2016/03/17 PHP
thinkphp验证码的实现(form、ajax实现验证)
2016/07/28 PHP
form自动提交实例讲解
2017/07/10 PHP
基于Jquery插件开发之图片放大镜效果(仿淘宝)
2011/11/19 Javascript
循环 vs 递归浅谈
2013/02/28 Javascript
一个可以增加和删除行的table并可编辑表格中内容
2014/06/16 Javascript
innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解
2015/03/13 Javascript
基于JS实现的笛卡尔乘积之商品发布
2016/05/13 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
vue.js中指令Directives详解
2017/03/20 Javascript
基于JavaScript 性能优化技巧心得(分享)
2017/12/11 Javascript
React中嵌套组件与被嵌套组件的通信过程
2018/07/11 Javascript
vue.js实现带日期星期的数字时钟功能示例
2018/08/28 Javascript
微信小程序简单的canvas裁剪图片功能详解
2019/07/12 Javascript
vue中重定向redirect:‘/index‘,不显示问题、跳转出错的完美解决
2020/09/28 Javascript
Python冲顶大会 快来答题!
2018/01/17 Python
python让列表倒序输出的实例
2018/06/25 Python
Python3实现的简单工资管理系统示例
2019/03/12 Python
django框架实现模板中获取request 的各种信息示例
2019/07/01 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
2020/02/28 Python
基于pandas向csv添加新的行和列
2020/05/25 Python
如何用css3实现switch组件开关的方法
2018/02/09 HTML / CSS
HTML5声音录制/播放功能的实现代码
2018/05/03 HTML / CSS
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
物控部经理职务说明书
2014/02/25 职场文书
《蚕姑娘》教学反思
2014/04/15 职场文书
挂靠协议书范本
2014/04/22 职场文书
经典演讲稿开场白
2014/08/25 职场文书
介绍信格式样本
2015/05/05 职场文书
2019年作为一名实习生的述职报告
2019/09/29 职场文书
Python 文本滚动播放器的实现代码
2021/04/25 Python
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python