函数与闭包基础
在 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'>
# print(greet_result()) # 报错,因为 greet_result 存储的是字符串,不是函数对象
这里将 greet 函数对象赋值给了变量 greet_func。此时 greet_func 实际上指向的是 greet 函数本身,而不是函数的返回值;而 greet_result = greet() 是先调用 greet 方法,然后把返回值赋给 greet_result 变量。
什么是闭包
在 Python 中,闭包(Closure)是一种特殊的函数,它由一个函数和该函数所引用的外部作用域中的变量组成。即使外部函数已经执行完毕,其局部变量的生命周期也会因闭包的存在而得以延长,闭包可以继续访问这些变量。
简单来说,闭包允许函数访问并操作其定义所在的外部作用域中的变量,即使该外部作用域已经结束。
构成闭包需要满足以下三个条件:
- 存在一个嵌套函数,即在一个函数内部定义另一个函数。
- 嵌套函数引用了外部函数的局部变量。
- 外部函数返回嵌套函数。
应用场景
- 数据封装和隐藏:可以将数据隐藏在闭包内部,只通过闭包提供的接口来访问和修改数据。
- 实现回调函数:在事件驱动编程中,闭包可以作为回调函数,保存一些上下文信息。
- 实现装饰器:装饰器是闭包的一种常见应用,用于在不修改原函数代码的情况下,为函数添加额外的功能。
实战示例
简单计数器闭包
def outer_function():
count = 0
def inner_function():
nonlocal count
count = count + 1
count
inner_function
counter = outer_function()
(counter())
(counter())
(counter())


