有勇气的牛排博客

Python 函数式编程 闭包 理解

有勇气的牛排 26 Python 2025-07-29 22:53:18

1 前言

1.1 定义

闭包是指一个函数定义在另一个函数内部,并且引用了外部函数的变量

当外部函数返回这个内部函数是,这个内部函数就会携带它的自由变量的引用环境,这种行为就称为闭包。

知识点分类:闭包属于 Python 函数式编程高级函数特性的。

简单理解:

闭包 = 内部函数 + 外部环境变量的引用

1.2 闭包的必要条件

  • 必须有一个 嵌套函数 (即内部函数)
  • 内部函数必须 引用 外部函数中的变量(自由变量)
  • 外部函数返回 内部函数的引用

2 基本案例

# -*- coding: utf-8 -*- def outer(x): def inner(y): return x + y return inner add = outer(5) print(add(10)) # 输出 15

说明:

  • x 是自由变量,由 outer 提供。
  • inner 是一个闭包,记住了 x=5
  • 调用 add(10) 实际上就是执行了 5+10

3 闭包的底层原理

内部函数可以访问外部函数的变量*,即使外部函数已经执行完毕。

这是因为 Python 把外部函数的作用于保存在了内部函数的 __closure__ 属性中。

# -*- coding: utf-8 -*- def outer(x, a=0): def inner(y): return (x + y) * a return inner add = outer(5, 2) print(add.__closure__[0].cell_contents) # 2 print(add.__closure__[1].cell_contents) # 5 print(f"调用结果:{add(10)}") # 调用结果:30

image.png

4 常见应用

4.1 数据封装(模拟私有变量)

# -*- coding: utf-8 -*- def counter(): count = 0 def inc(): nonlocal count count = count + 1 return count return inc c = counter() print(c()) # 1 print(c()) # 2

4.2 延迟计算(函数工程)

# -*- coding: utf-8 -*- def make_multiplier(fackor): def multiply(x): return x * fackor return multiply double = make_multiplier(2) print(double(10)) # 输出 20

4.3 装饰器原理

装饰器的本质也是闭包。

# -*- coding: utf-8 -*- def log(func): def wrapper(*args, **kwargs): print(f"正在执行:{func.__name__}") return func(*args, **kwargs) return wrapper @log def hello(name): print(f"你好, {name}") hello("有勇气的牛排")

5 注意点

  • 闭包中的变量是共享的,多个闭包共享一个自由变量时需要注意修改冲突。
  • 使用 nonloacal 可以在闭包中修改外层变量。
  • 闭包容易造成 内存泄漏,尤其在长生命周期中,需要注意引用释放。

6 面试回答

闭包是指一个内部函数引用了外部函数变量,并且外部函数返回了这个内部函数。它使得函数可以记住定义时的环境,即便外部函数已经执行结束。

它通常用于延迟计算、函数封装、函数工厂和装饰器等场景,是函数式编程的重要特性之一。

评论区

×
×