闭包
1. 闭包
Python 中的闭包是指延伸了作用域的函数,其中包含函数定义体中引用、但是不在定义体中定义的非全局变量。函数是不是匿名的没有关系,关键是它能访问定义体之外定义的非全局变量。
python
def make_averager():
series = []
def averager(new_value):
series.append(new_value)
total = sum(series)
return total / len(series)
return averager
2. 防止闭包副作用
在使用 Lambda 表达式时,如果使用了外部变量,那么在调用 Lambda 表达式时,外部变量的值会被保存,而不是在调用时获取。
python
def demo():
funcs = [lambda x: x + n for n in range(5)]
for f in funcs:
print(f(0))
此时,输出结果为:
python
4
4
4
4
4
如果我们希望输出结果为 0 1 2 3 4
,可以使用默认参数:
python
def demo():
funcs = [lambda x, n=n: x + n for n in range(5)]
for f in funcs:
print(f(0))
也可以使用 functools.partial
:
python
from functools import partial
def demo():
funcs = [partial(lambda n, x: x + n, n) for n in range(5)]
for f in funcs:
print(f(0))