Python中什么是闭包?
闭包的定义
闭包(Closure)是Python中的一种函数机制。当一个内部函数引用了外部函数的变量,而外部函数已经执行完毕并返回了这个内部函数,内部函数仍然可以访问外部函数中的变量,这样的内部函数就是闭包。
示例代码解释:
def outer_function(x):
def inner_function(y):
return x + y
return inner_function
closure_func = outer_function(10)
print(closure_func(5)) # 输出 15
- 定义外层函数
- 定义了
outer_function函数,接收参数x。 - 在
outer_function内部定义了inner_function函数,接收参数y,并返回x + y。 outer_function返回内部函数inner_function。
- 定义了
- 创建闭包
- 调用
outer_function(10),返回值赋给closure_func。 - 此时,
closure_func是一个闭包,它“记住”了outer_function中的变量x的值(10)。
- 调用
- 调用闭包
- 调用
closure_func(5),即调用inner_function并传入y=5。 inner_function可以访问外部函数中的变量x(值为10),计算并返回x + y(10 + 5 = 15)。
- 调用
闭包的使用场景
闭包常用于以下场景:
- 函数工厂:生成具有特定行为的函数。
- 装饰器:用于增强函数功能。
- 维持状态:例如计数器,允许创建带有状态的可重用函数,而无需依赖全局变量。
示例代码:
def make_multiplier(n):
def multiplier(x):
return x * n
return multiplier
times3 = make_multiplier(3)
print(times3(9)) # 输出 27
闭包的优势
- 避免全局变量:闭包可以避免使用全局变量,从而减少代码的副作用,使代码更模块化、更易于维护。
- 数据封装:通过闭包,可以隐藏一些状态信息,使外部无法直接访问和修改这些状态,增强了数据的封装性和安全性。
Cell对象
在Python中,闭包中的外部变量会被存储在一个叫做“cell对象”的东西里。可以通过函数对象的__closure__属性来访问这些cell对象。__closure__是一个元组,包含函数闭包中引用的每个变量的cell对象。
示例代码:
def outer_function(x):
def inner_function(y):
return x + y
return inner_function
closure_func = outer_function(10)
print(closure_func.__closure__[0].cell_contents) # 输出 10
延迟计算和记忆化
闭包也常用于延迟计算或记忆化(Memoization)技术中。记忆化是一种优化技术,通过缓存函数的计算结果,当再次调用函数时如果参数相同可以直接返回缓存的结果,从而提高程序的效率。
示例代码:
def memoize(f):
cache = {}
def memoized_function(x):
if x not in cache:
cache[x] = f(x)
return cache[x]
return memoized_function
@memoize
def slow_function(x):
# 假设这是一个耗时很长的计算
return x * x
print(slow_function(5)) # 第一次调用会计算并缓存结果
print(slow_function(5)) # 第二次调用时将从缓存中获取结果
浙公网安备 33010602011771号