python闭包

什么是闭包?

简单说,闭包就是根据不同的配置信息得到不同的结果

再来看看专业的解释:闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。

python实例

例1

defmake_adder(addend):

defadder(augend):

returnaugend + addend

returnadder

p = make_adder(23)

q = make_adder(44)

printp(100)printq(100)

运行结果:

123144

分析一下:

我们发现,make_adder是一个函数,包括一个参数addend,比较特殊的地方是这个函数里面又定义了一个新函数,这个新函数里面的一个变量正好是外部make_adder的参数.也就是说,外部传递过来的addend参数已经和adder函数绑定到一起了,形成了一个新函数,我们可以把addend看做新函数的一个配置信息,配置信息不同,函数的功能就不一样了,也就是能得到定制之后的函数.

再看看运行结果,我们发现,虽然p和q都是make_adder生成的,但是因为配置参数不同,后面再执行相同参数的函数后得到了不同的结果.这就是闭包.

例2

defhellocounter(name):

count=[0]

defcounter():

count[0]+=1

print'Hello,',name,',',str(count[0])+' access!'

returncounter

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 hello counter(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""+ fn() +""

return wrapped

def makeitalic(fn):

def wrapped():

return ""+ fn() +""

return wrapped

@makebold@makeitalicdefhello():

return"hello world"

print hello()

执行结果

<b><i>hello worldi>b>

简单分析

怎么样?这个程序熟悉吗?这不是传说的的装饰器吗?对,这就是装饰器,其实,装饰器就是一种闭包,我们再回想一下装饰器的概念:对函数(参数,返回值等)进行加工处理,生成一个功能增强版的一个函数。再看看闭包的概念,这个增强版的函数不就是我们配置之后的函数吗?区别在于,装饰器的参数是一个函数或类,专门对类或函数进行加工处理。

python里面的好多高级功能,比如装饰器,生成器,列表推到,闭包,匿名函数等,开发中用一下,可能会达到事半功倍的效果!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 所谓闭包,就是将组成函数的语句和这些语句的执行环境打包在一起时,得到的对象。 下面是闭包的栗子: 这个栗子就是想说...
    MJXH阅读 351评论 0 1
  • 一、python函数作用域LEGB python解释器查找变量的原则(顺序):L→E→G→BL:Local函数内部...
    风萧雨霖阅读 483评论 0 0
  • 闭包 所谓闭包,就是将组成函数的语句和这些语句的执行环境打包在一起时,得到的对象。 栗子1 上面这个函数有点纠结!...
    MJXH阅读 391评论 0 0
  • 我在博客中曾经介绍过两篇关于函数的文章,第一篇是 关于 Python 函数是第一类对象,第二篇是关于 Lambda...
    liuzhijun阅读 1,558评论 2 27
  • This book mainly tells us the experience of a prince from...
    你似故人来阅读 164评论 0 0