闭包在许多场景中非常有用,例如创建工厂函数、装饰器、数据封装等。
1. 闭包的结构
一个典型的闭包包含以下部分:
- 内部函数:定义在外部函数内部的函数。
- 自由变量:内部函数引用的外部函数中的变量。
- 闭包对象:内部函数对象,包含了对自由变量的引用。
2. 闭包的应用场景
2.1 工厂函数
工厂函数可以根据不同的参数返回不同的函数对象。
def make_multiplier(factor):
def multiplier(number):
return number * factor
return multiplier
# 创建两个不同的乘法器
double = make_multiplier(2)
triple = make_multiplier(3)
print(double(5)) # 输出: 10
print(triple(5)) # 输出: 15
解释:
make_multiplier是外部函数,factor是自由变量。multiplier是内部函数,它引用了factor。- 每次调用
make_multiplier都会返回一个新的multiplier函数对象,每个对象都捕获了不同的factor值。
2.2 装饰器
装饰器是一种高阶函数,它接受一个函数作为参数并返回一个新的函数。闭包常用于实现装饰器。
def my_decorator(func):
def wrapper(*args, **kwargs):
print("函数调用前")
result = func(*args, **kwargs)
print("函数调用后")
return result
return wrapper
@my_decorator
def say_hello(name):
print(f"Hello, {name}!")
say_hello("Alice")
输出:
函数调用前
Hello, Alice!
函数调用后
解释:
my_decorator是外部函数,func是自由变量。wrapper是内部函数,它引用了func。wrapper在调用func之前和之后添加了额外的逻辑。
2.3 数据封装
闭包可以用于封装数据,提供对外的接口而隐藏内部实现。