Python函数闭包原理剖析
闭包形成条件
- 嵌套函数:在一个函数内部定义另一个函数。
- 内部函数引用外部函数的变量:内部函数使用了外部函数作用域中的变量。
- 外部函数返回内部函数:将内部函数作为返回值返回,使得内部函数在外部函数执行结束后依然可以访问其外部函数的变量。
作用域相关知识
- Python作用域规则:Python有四个作用域,分别是局部作用域(Local)、嵌套作用域(Enclosing)、全局作用域(Global)和内置作用域(Built - in)。当访问一个变量时,Python会按照LEGB顺序查找变量。闭包涉及到嵌套作用域,内部函数可以访问外部函数(嵌套作用域)的变量,即使外部函数已经执行完毕。
- 变量生命周期:通常情况下,函数执行完毕后,其局部变量会被销毁。但在闭包中,由于内部函数引用了外部函数的变量,这些变量的生命周期会延长,直到内部函数不再被引用。
闭包实现可动态调整阈值的过滤器案例
def threshold_filter_creator(threshold):
def threshold_filter(data):
return [value for value in data if value > threshold]
return threshold_filter
# 创建一个阈值为5的过滤器
filter_5 = threshold_filter_creator(5)
data_list = [1, 3, 7, 4, 9, 2]
result = filter_5(data_list)
print(result)
# 创建一个阈值为3的过滤器
filter_3 = threshold_filter_creator(3)
result = filter_3(data_list)
print(result)
闭包在案例中的关键作用
- 动态性:闭包允许我们在运行时动态创建不同阈值的过滤器。每次调用
threshold_filter_creator
函数并传入不同的threshold
值,就可以创建一个具有特定阈值的过滤器函数。
- 数据封装:闭包将阈值
threshold
封装在内部函数threshold_filter
中,外部无法直接访问和修改这个阈值。只有通过调用内部函数才能使用这个封装的阈值进行过滤操作,提高了代码的安全性和可维护性。
- 延长变量生命周期:外部函数
threshold_filter_creator
执行完毕后,其参数threshold
并不会被销毁,因为内部函数threshold_filter
引用了它。这使得每个创建的过滤器都能记住自己特定的阈值,即使外部函数的执行环境已经结束。