在 Python 里,函数是一等公民。这意味着函数可以像整数、字符串一样被赋值给变量,甚至作为参数传递或从其他函数返回。
def greet(): return "Hello!"
# 将方法赋给变量(无括号,得到方法对象)
greet_func = greet
print(greet_func())
print(type(greet_func)) # <class 'function'>
# 有括号,直接调用方法并将结果赋给变量
greet_result = greet()
print(greet_result)
print(type(greet_result)) # <class 'str'>
这里 greet_func 指向的是函数对象本身,而 greet_result 存储的是函数的返回值。理解这一点是掌握闭包的基础。
什么是闭包
闭包(Closure)是一种特殊的函数结构,它由一个函数和该函数所引用的外部作用域中的变量组成。即使外部函数已经执行完毕,其局部变量的生命周期也会因闭包的存在而得以延长,内部函数可以继续访问这些变量。
简单来说,闭包允许函数访问并操作其定义所在的外部作用域中的变量,即使该外部作用域已经结束。
构成闭包需要满足以下三个条件:
- 存在一个嵌套函数,即在一个函数内部定义另一个函数。
- 嵌套函数引用了外部函数的局部变量。
- 外部函数返回嵌套函数。
闭包的应用场景
- 数据封装和隐藏:可以将数据隐藏在闭包内部,只通过闭包提供的接口来访问和修改数据。
- 实现回调函数:在事件驱动编程中,闭包可以作为回调函数,保存一些上下文信息。
- 实现装饰器:装饰器是闭包的一种常见应用,用于在不修改原函数代码的情况下,为函数添加额外的功能。
代码实例
简单计数器闭包
def outer_function():
count = 0
def inner_function():
nonlocal count
count = count + 1
return count
return inner_function
counter = outer_function()
print(counter()) # 输出:1
print(counter()) # 输出:2
print(counter())


