闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。
试试看
def outer_func(a, b):
def inner_func(x):
return a * x + b
return inner_func
func = outer_func(2, 3)
print func(4)
调用outer_func的时候产生了一个闭包inner_func,该闭包持有自由变量a和b
当函数
func = outer_func(2, 3)
执行完成后,a和b两个变量没有消失,因为它被闭包inner_func引用了,所以不会被回收。
把outer_func看成类,inner_func看成实例方法,过程蛮像。
不同的是父函数只在调用时执行,执行完毕后其环境就会释放。
类在文件执行时创建,程序执行完毕后作用域才释放。
因此对一些需要重用的功能且不足以定义为类的行为,使用闭包会更节省资源。
函数工厂,可以闭包来完成:
def max_length(n):
def validator(s):
if len(s) < n:
return
raise Exception('Length of string must be less than {0}!'.format(n))
return validator
n=30,如果字符串s的长度大于30,就会抛出异常
装饰器跟闭包也比较像。