Python 闭包

01

返回函数

函数名是变量名,那么自然可以作为函数的返回值返回。

def lazy_sum(mylist):

def sum():

return reduce(lambda x, y: x + y, mylist)

return sum

如上所示,lazy_sum函数返回一个函数,其名字叫做sum,它如何使用呢?

mysum = lazy_sum([1,3,5,7])

print(mysum)

#

lazy_sum的返回函数赋值给mysum,当我们打印mysum时发现,并没有真正运行内部包裹的函数sum,而是返回一个sum的地址值,因此这是一种延迟加载。

so,调用 mysum()

结果:

16

这才真正运行了内部函数sum

一般的函数,比如:

def sum2():

return reduce(lambda x, y: x + y, mylist)

我们直接调用 rslt = sum2([1,3,5,7]),直接拿到结果了。

注意,lazy_sum(mylist)的参数为mylist,而位于它内部的函数sum()是没有参数的,但是sum()函数在内部却可以引用外部函数的参数 mylist,这说明什么?

02

闭包

当函数lazy_sum返回了一个函数sum后,外部函数lazy_sum的变量还被内部函数或返回的新函数sum引用,这被称为闭包。

一般地,函数内部的临时变量或参数只能被它自己所用,不可能被其他函数引用。

但是,闭包时,返回的内部函数却可以引用其外部的函数中的临时变量和参数。

03

闭包例子

"""

lazy sum

"""

def lazy_sum2(mylist):

tmp=10

def sum():

return reduce(lambda x, y: x + y, mylist)

return sum,tmp

sumfun,tmp = lazy_sum2([1,3,5,7])

print(sumfun())

#16

print(tmp)

#10

可以看到lazy_sum2函数内的tmp临时变量可以被内部函数sum引用

总结:闭包具有延迟加载特性,返回的函数可以引用其外部函数的局部变量和参数。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180206G00THS00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券