AI可以解决编程问题,但解决不了你对闭包的理解。通俗

The user is asking about what closures are useful for. This is a conceptual question, I can answer directly without tools.

闭包的作用

闭包就是一个函数"记住"了它定义时的环境。它解决的核心问题是:让函数带着数据走

1. 携带配置(工厂函数)

def make_greeter(prefix):
    def greet(name):
        return f"{prefix}, {name}!"   # 记住了 prefix
    return greet

hello = make_greeter("你好")   # prefix 被绑定成 "你好"
hi    = make_greeter("嗨")

hello("小明")  # "你好, 小明!"
hi("小明")     # "嗨, 小明!"

不用闭包的话,你得每次都传 prefix,或者用类。

2. 替代类(保持状态)

# 闭包写法
def make_counter():
    count = 0
    def increment():
        nonlocal count
        count += 1
        return count
    return increment

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

等价于一个类:

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

闭包更轻量,状态被封装在函数内部,外部无法直接访问 count

3. 回调函数携带上下文

def make_handler(url):
    async def on_event(data):
        await http_post(url, data)    # 记住了 url
    return on_event

# 注册不同 URL 的处理器
app.on("order",  make_handler("https://api.com/order"))
app.on("refund", make_handler("https://api.com/refund"))

每个回调自动绑定了自己的 URL,不需要额外存。

4. 延迟执行 + 数据打包

def multiply(factor):
    return lambda x: x * factor

double  = multiply(2)
triple  = multiply(3)

double(5)   # 10
triple(5)   # 15

factor 在创建时绑定,调用时才计算。

回到你的项目

build_tools() 里的 remember 就是一个典型闭包:

def build_tools(memory):
    # memory 被闭包捕获
    def remember(fact):
        memory.add_fact(fact)    # 记住了 memory
        return f"已记住: {fact}"
    
    reg.register("remember", remember, ...)
    return reg

remember 注册进 ToolRegistry 后,build_tools() 已经执行完了。但 remember 仍然"记着"传进来的 memory 实例——这就是闭包的作用:函数定义时打包数据,调用时使用数据

总结

场景没有闭包有闭包
函数需要记住配置每次传参自动携带
保持状态写个类一个函数搞定
回调携带数据全局变量或类闭包自动捕获
数据封装private 属性变量天然不可外部访问

一句话:闭包 = 函数 + 它记住的环境,让函数变成一个自带数据的"便携包"。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成王爷

学会的就要教给人

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值