什么是闭包?
满足下列三个条件的:
- 函数里面嵌套另一个函数
- 内层函数引用了外层函数的变量
- 外层函数的返回值是内层函数
那么这个返回的函数就是闭包.
举个例子:
def outer(foo):
def inner():
print(foo)
return inner
closure = outer('hi') # 这个 closure 就是一个闭包
closure()
# 输出 hi
为什么要闭包?
保存参数
函数的行为由参数决定, 有时候我们需要重复调用同一函数, 而且 每次调用的时候很多参数都是一样的, 那么这时候可以通过闭包来达到保存参数的作用.
举个例子:
def print_with_prefix(prefix):
def _(*argv):
print(prefix, *argv)
return _
sharp = print_with_prefix('# ')
sharp('hi', 'how are you')
bang = print_with_prefix('! ')
bang('hihi', 'im fine')
有点类似 JavaScript 的 bind 函数…
与 @ 的关系
@修饰符是闭包的延伸.
因为闭包相当于一个经过加工的函数, 外层函数的作用主要是预处理, 内层函数 (闭包) 里存放的是核心逻辑. 因此, 如果有一个第三方或者你自己提前写好的外层函数, 你可以通过 @ 修饰符直接将被修饰的函数作为闭包嵌套进外部函数中去.