MST

星途 面试题库

面试题:Python函数的闭包原理及复杂应用

深入剖析Python函数闭包的原理,包括闭包形成的条件、作用域相关知识。请设计一个使用闭包解决实际问题的复杂案例,例如实现一个可动态调整阈值的过滤器,说明闭包在其中的关键作用。
39.0万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

Python函数闭包原理剖析

闭包形成条件

  1. 嵌套函数:在一个函数内部定义另一个函数。
  2. 内部函数引用外部函数的变量:内部函数使用了外部函数作用域中的变量。
  3. 外部函数返回内部函数:将内部函数作为返回值返回,使得内部函数在外部函数执行结束后依然可以访问其外部函数的变量。

作用域相关知识

  1. Python作用域规则:Python有四个作用域,分别是局部作用域(Local)、嵌套作用域(Enclosing)、全局作用域(Global)和内置作用域(Built - in)。当访问一个变量时,Python会按照LEGB顺序查找变量。闭包涉及到嵌套作用域,内部函数可以访问外部函数(嵌套作用域)的变量,即使外部函数已经执行完毕。
  2. 变量生命周期:通常情况下,函数执行完毕后,其局部变量会被销毁。但在闭包中,由于内部函数引用了外部函数的变量,这些变量的生命周期会延长,直到内部函数不再被引用。

闭包实现可动态调整阈值的过滤器案例

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)

闭包在案例中的关键作用

  1. 动态性:闭包允许我们在运行时动态创建不同阈值的过滤器。每次调用threshold_filter_creator函数并传入不同的threshold值,就可以创建一个具有特定阈值的过滤器函数。
  2. 数据封装:闭包将阈值threshold封装在内部函数threshold_filter中,外部无法直接访问和修改这个阈值。只有通过调用内部函数才能使用这个封装的阈值进行过滤操作,提高了代码的安全性和可维护性。
  3. 延长变量生命周期:外部函数threshold_filter_creator执行完毕后,其参数threshold并不会被销毁,因为内部函数threshold_filter引用了它。这使得每个创建的过滤器都能记住自己特定的阈值,即使外部函数的执行环境已经结束。