跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Python 闭包(Closure)核心概念与实战应用

Python 闭包概念,即函数捕获外部变量形成带状态的对象。通过对比普通函数与类,展示闭包在轻量级对象构建中的优势。结合 Callable 类型注解,阐述了闭包在 Agent、回调及配置型函数等工程场景中的应用,并给出了适用与不适用闭包的判断标准。

moshang发布于 2026/3/22更新于 2026/10/2499 浏览

一、什么是闭包?先用一句人话解释

闭包 = 函数 + 它创建时所捕获的外部变量

也可以理解为:

'带私有状态的函数'


二、一个最小但完整的闭包示例

def make_adder(x):
    def adder(y):
        return x + y
    return adder

使用方式:

add_10 = make_adder(10)
print(add_10(5))  # 15
print(add_10(20)) # 30
发生了什么?
  • make_adder(10) 执行完后,本应销毁
  • 但 adder记住了 x = 10
  • x 被'封'在函数里 —— 这就是 closure

📌 重点:
x 并不是参数,而是被'捕获'的变量


三、闭包 vs 普通函数

❌ 普通函数(无状态)
def add(x, y):
    return x + y
  • 每次调用都要传全参数
  • 无法保存中间状态

✅ 闭包(有状态)
def make_counter():
    count = 0
    def counter():
        nonlocal count
        count += 1
        return count
    return counter

使用:

c = make_counter()
print(c())  # 1
print(c())  # 2
print(c())  # 3

👉 你得到了一个不依赖 class 的'对象'


四、闭包 ≈ 轻量级对象(非常重要)

我们用 class 对比一下:

class Counter:
    def __init__(self):
        self.count = 0
    def next(self):
        self.count += 1
        return self.count

而闭包版本:

def make_counter():
    count = 0
    def next():
        nonlocal count
        count += 1
        return count
    return next
工程角度对比
对比项闭包class
语法复杂度低高
私有状态天然支持需要 self
适合 Agent / 回调✅一般
适合复杂模型一般✅

📌 这也是为什么 AI / LangChain 场景大量用闭包


五、一个经典工程示例:配置型函数

def make_logger(prefix):
    def log(message):
        print(f"[{prefix}] {message}")
    return log

使用:

info = make_logger("INFO")
error = make_logger("ERROR")
info("service started")
error("db connection failed")

👉 不需要 class
👉 不需要全局变量
👉 每个 logger 都是'定制实例'


六、闭包在 Web / AI 中的真实用途

示例:构建一个 Agent(你刚写过的)
from typing import Callable

def build_agent() -> Callable[[str], str]:
    memory = []
    def agent(prompt: str) -> str:
        memory.append(prompt)
        return f"History size: {len(memory)}"
    return agent

使用:

agent = build_agent()
print(agent("hi"))  # History size: 1
print(agent("hello"))  # History size: 2

🧠 这里的 agent 就是一个'带状态的函数对象'


七、Callable 是什么?为什么要引入?

先看这行代码:

def build_agent() -> Callable[[str], str]:
它的含义是:

build_agent 返回一个函数
这个函数:接收 str 返回 str

等价于 Java:

Function<String,String>

八、为什么闭包 + Callable 是绝配?

1️⃣ 没有 Callable 会怎样?
def build_agent():
    ...
  • IDE 无法提示
  • FastAPI 无法校验
  • 你不知道 agent 怎么用

2️⃣ 加上 Callable 后
def build_agent() -> Callable[[str], str]:

你立刻知道:

  • 这是一个 agent
  • 输入输出是什么
  • 可以当作参数传递

📌 Callable = 闭包的'类型说明书'


九、再来几个经典闭包场景(速览)

1️⃣ 权限校验器(类似装饰器)
def require_role(role):
    def check(user_role):
        return user_role == role
    return check

2️⃣ 延迟执行(lazy eval)
def lazy_sum(*nums):
    def calc():
        return sum(nums)
    return calc

3️⃣ 策略模式(无 class)
def make_strategy(rate):
    def apply(price):
        return price * rate
    return apply

十、什么时候该用闭包?什么时候不用?

✅ 适合用闭包
  • Agent / Tool
  • 回调函数
  • FastAPI 依赖注入
  • 状态简单、生命周期短
❌ 不适合用闭包
  • 复杂继承
  • 大量方法
  • 状态结构复杂

👉 那种场景用 class


十一、总结一句话

闭包让函数拥有'状态',Callable 让函数拥有'类型'

在现代 Python(尤其是 AI / Web / 工程领域):

闭包 + Callable = 轻量级对象系统

目录

  1. 一、什么是闭包?先用一句人话解释
  2. 二、一个最小但完整的闭包示例
  3. 发生了什么?
  4. 三、闭包 vs 普通函数
  5. ❌ 普通函数(无状态)
  6. ✅ 闭包(有状态)
  7. 四、闭包 ≈ 轻量级对象(非常重要)
  8. 工程角度对比
  9. 五、一个经典工程示例:配置型函数
  10. 六、闭包在 Web / AI 中的真实用途
  11. 示例:构建一个 Agent(你刚写过的)
  12. 七、Callable 是什么?为什么要引入?
  13. 它的含义是:
  14. 八、为什么闭包 + Callable 是绝配?
  15. 1️⃣ 没有 Callable 会怎样?
  16. 2️⃣ 加上 Callable 后
  17. 九、再来几个经典闭包场景(速览)
  18. 1️⃣ 权限校验器(类似装饰器)
  19. 2️⃣ 延迟执行(lazy eval)
  20. 3️⃣ 策略模式(无 class)
  21. 十、什么时候该用闭包?什么时候不用?
  22. ✅ 适合用闭包
  23. ❌ 不适合用闭包
  24. 十一、总结一句话

更多推荐文章

查看全部
  • 基于优化理论的相位恢复算法
  • AI Agent 新范式:基于 FastGPT 与 MCP 协议构建工具增强型智能体
  • 算法实战:归并排序与数组逆序对详解
  • 前端开发必读:HTML5 Doctype 与浏览器渲染模式详解
  • C++ 模板进阶:非类型参数、特化与分离编译
  • OAuthSwift:Swift OAuth 库的 8 大核心优势解析
  • Linux 前台与后台进程管理及守护进程创建
  • Python 实现活性污泥模型 ASM2d 参数校准与优化
  • Python 实现现代游戏窗口无闪烁高性能 DX11/DX12 截图方案
  • SpringBoot + PostGIS 城市道路里程计算与缓存优化实战
  • 数据结构:二叉树基础与 C 语言实现详解
  • 前端 Vue 对接 UNet 后端:跨域 CORS 配置方案
  • WorkBuddy 接入 QQ 机器人配置指南
  • 2025年12月GESP C++五级真题:相等序列
  • Android 程序员发展前景与 Framework 底层技术解析
  • 数据结构:顺序表与链表经典算法实战
  • Stable Diffusion 3.5 FP8 文生图技术解析与应用
  • C++ 入门:命名空间(namespace)详解
  • MiniMax 海螺 AI 视频:图片与文本生成高质量视频
  • 统一 OpenAI API 格式调用 20+ 主流大模型方案

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online