python闭包的理解

2016-10-25 19:05:27

什么是闭包

维基上的解释:
在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。

假如用一句话来理解这段话:函数内在包含子函数,并最终return子函数

举个栗子:

1
2
3
4
5
6
7
def parent(name):
def child(age):
print 'name:', name, 'age:', age
return child

who = parent('tomcat')
who(26) # >>> name: tomcat age: 26

在调用parent的时候就产生了一个闭包–child,该闭包持有自由变量–name.即当函数parent的生命周期结束后,name的变量依然存在。因为它被闭包引用了,所以不会被回收。

闭包的应用

1
2
3
4
5
6
7
8
9
10
11
def decorator_func(func):
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper

@decorator_func
def func(name):
print 'my name is', name

#等价于
decorator_func(func)

在这个例子中,闭包(wrapper)有外部的func这个参数,并且能接收外部传来的参数,并将参数传递给func,返回执行结果

总结,在Python中创建一个闭包可以归结为以下三点:

  • 闭包函数必须有内嵌函数
  • 内嵌函数需要引用该嵌套函数上一级namespace中的变量
  • 闭包函数必须返回内嵌函数

参考

python 深入闭包
python 中的闭包


您的鼓励是我写作最大的动力

俗话说,投资效率是最好的投资。 如果您感觉我的文章质量不错,读后收获很大,预计能为您提高 10% 的工作效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。