闭包(Closure)是Python中一个很强大的特性。一个闭包是一个函数,它记住了创建它时的环境。简单说,闭包是一个函数和它的环境的引用捆绑在一起。
闭包的优点是:
- 可以避免使用全局变量,更清晰地表达变量的作用域。
- 闭包可以延长局部变量的生命周期。
- 可以封装一些可执行的环境。
在Python中,闭包可以这样使用:
- 在一个函数内部定义另一个函数,并且内部函数引用了外部函数的变量。
- 外部函数返回内部函数,这就构成了一个闭包。
- 每次调用外部函数都会返回一个新的闭包(内部函数的引用)。
# 例1:计算移动平均值
def make_averager():
count = 0
total = 0
def averager(new_value):
count += 1
total += new_value
return total / count
return averager
avg = make_averager()
avg(10) # 10.0
avg(20) # 15.0
avg(30) # 20.0
# 例2:记录函数调用次数
def make_counter():
count = 0
def counter():
nonlocal count
count += 1
return count
return counter
c1 = make_counter()
c2 = make_counter()
c1() # 1
c1() # 2
c2() # 1
c2() # 2
在上例中:
- make_averager()函数返回averager()函数的引用,构成闭包。averager()引用了外层函数的变量。
- make_counter()函数返回counter()函数的引用,构成闭包。counter()使用nonlocal关键字修改外层函数的变量。
- 每次make_averager()和make_counter()的调用都返回一个新的闭包。