闭包,又称闭包函数或闭合函数,和嵌套函数类似。不同之处在于,闭包函数的外部函数返回的不是一个具体的值,而是一个函数。一般情况下,返回的函数会赋值给一个变量,便于反复调用。
def outer(out):
def inner(inn):
return inn ** out
# 返回inner函数
return inner
# 计算一个数的平方
square = outer(2)
# 计算一个数的立方
cube = outer(3)
# out=2,inn=2
print(square(2))
# out=3,inn=2
print(cube(2))
运行结果为
4
8
在上面程序中,外部函数 outer() 的返回值是函数 inner(),而不是一个具体的数值。
需要注意的是,在执行完 square = outer(2) 和 cube = outer(3) 后,外部函数 outer() 的参数 out 会和内部函数 inner 一起赋值给 square 和 cube,这样在之后调用 square(2) 或者 cube(2) 时,程序就能顺利地输出结果,而不会报错说参数 out 没有定义。
不信输出square试试看:
print(square)
结果为:
<function outer.<locals>.inner at 0x0000019CACBD41F8>
function表明square是一个函数。因为square包含了参数out和内部函数inner。0x0000019CACBD41F8是存放的地址。
使用闭包的好处
上面的程序,完全可以写成下面的形式:
def outer_rewrite(inn, out):
return inn ** out
但是,为什么不用这种方式呢?
使用闭包可以让程序更加简单易读。当函数需要反复调用时,差别就出来了。比如需要计算很多个数的平方,大家觉得下面那种方式更简洁呢?
# 不使用闭包
ex1 = outer_rewrite(inn1,2)
ex2 = outer_rewrite(inn2,2)
ex3 = outer_rewrite(inn3,2)
# 使用闭包
square = outer(2)
ex1 = square(inn1)
ex2 = square(inn2)
ex3 = square(inn3)
答案已经显而易见了。使用闭包比不适用闭包简洁得多。这也是闭包出现的原因。你,get到了么?
参考文献
[1] 什么是闭包,Python闭包(初学者必读) ,C语言中文网