在函数编程语言中, 闭包是一个比较重要且强大的特性.
python 也支持闭包.
什么是闭包?
如果一个函数使用了外部函数的局部变量, 那么这个函数就是一个闭包.
闭包的特点:
闭包函数可以访问他所在的外部函数的局部变量. 即使外部函数已经运行结束, 对闭包函数来说仍然可以访问到外部函数的局部变量
闭包访问外部函数的局部变量的值, 总是这个变量的最新的值!
1.1.定义一个闭包
def outer():
x = 20
def inner():
"""
inner 函数访问了外部函数 outer 的局部变量 x, 所以这个时候 inner
就是一个闭包函数.
:return:
"""
nonlocal x
x += 10
return x
x = 30
return inner
# 调用 outer, 得到的是内部的闭包函数 inner 所以 f 和 inner 其实指向了同一个函数对象
f = outer()
'''
调用 f. f是一个闭包函数,所以他访问的总是外部变量的最新的值,
所以 f 执行的时候 x 的值已经是30. 最终返回的是40
'''
print(f())
1.2.闭包的应用
闭包很强大, 也有一些比较适合的场景!
惰性求值(lazy evaluation, 延迟求值)
def foo(msg):
def say_msg():
print("hello" + str(msg))
return say_msg
say = foo("志玲")
say()
说明:
上面的代码中foo
函数仅仅是声明了一个嵌套函数, 和把这个嵌套函数返回.
真正的代码其实是定义在了内部的嵌套函数中.
这种写法就是一种惰性求值!
使用闭包保持状态
如果需要在一系列函数调用中保持某种状态, 使用闭包是一种非常高效的方法.
一个简单的计数器:
def count_down(num):
def next():
nonlocal num
temp = num
num -= 1
return temp
return next
# 使用前面的函数计数
next = count_down(10)
while True:
value = next() # 每调用一次就会减少一次计数
print(value)
if value == 0:
break