回调函数的一点东西

        简单来说,就是将一个函数A(),作为另一个函数的参数B(arg c1,A),当B执行时就会回调A来完成某个事件的处理,A就为回调函数。

        允许多重回调函数。

        通过传入不同的回调函数可以让已有的函数执行不同的处理方法,从而实现不修改源码而改变方法的执行方式,与反射有异曲同工之妙。

 

 

是的,**函数名可以作为参数传递给其他函数**!这是 Python(以及大多数现代编程语言)中一个非常强大且常用的功能。 --- ### ✅ 答案简述: 在 Python 中,**函数是一等公民(first-class objects)**,这意味着: > 函数可以像整数、字符串、列表一样被赋值、传递、存储和返回。 所以你可以把一个函数的名字(不带括号)当作参数传给另一个函数,并在内部调用它。 --- ### 🔧 示例:函数作为参数 ```python def greet(name): return f"Hello, {name}!" def farewell(name): return f"Goodbye, {name}!" # 定义一个高阶函数:接受“函数”作为参数 def say_something(name, func): print(func(name)) # 在这里调用传进来的函数 # 使用:把函数名作为参数传入(不加括号) say_something("Alice", greet) # 输出: Hello, Alice! say_something("Bob", farewell) # 输出: Goodbye, Bob! ``` 📌 注意: - `greet` 和 `farewell` 是函数对象,不是调用结果; - 没有写 `greet()` 或 `farewell()` —— 加了括号就会立即执行并传回结果; - 这里传的是“函数本身”,而不是“函数的返回值”。 --- ### 🧠 更进一步:为什么能这么做? Python 中一切皆对象: | 类型 | 是否可作为参数 | |------|----------------| | int, str, list | ✅ 可以 | | 函数 | ✅ 同样是对象,也可以 | 你可以验证这一点: ```python print(greet) # <function greet at 0x...> print(type(greet)) # <class 'function'> print(greet.__name__) # 'greet' ``` 这说明 `greet` 是一个实实在在的对象,可以被引用、传递。 --- ### 💡 实际应用场景 #### 1. **回调函数(Callback)** ```python def train_model(data, on_epoch_end): for epoch in range(3): print(f"Epoch {epoch} training...") on_epoch_end(epoch) # 训练完每轮调用一次 def log_epoch(epoch): print(f"✅ Epoch {epoch} finished!") train_model("my_data", log_epoch) ``` #### 2. **传递模型进行评估(如你遇到的场景)** ```python def evaluate_accuracy(model_func, data_iter): correct = 0 total = 0 for X, y in data_iter: y_hat = model_func(X) # ← 调用传入的模型函数或可调用对象 pred = torch.argmax(y_hat, dim=1) correct += (pred == y).sum().item() total += y.size(0) return correct / total # 使用时传入模型实例(它也是可调用的) acc = evaluate_accuracy(net, test_iter) # net 是 nn.Module 实例,支持 __call__ ``` > ⚠️ 注意:虽然 `net` 是类实例,但因为它继承自 `nn.Module` 并实现了 `__call__`,所以它“行为上像函数”,也能作为“可调用对象”传参。 --- ### 🎯 补充知识:什么是“可调用对象”? 任何能用 `()` 调用的东西都叫 callable。 可以用 `callable()` 判断: ```python print(callable(greet)) # True - 普通函数 print(callable(len)) # True - 内置函数 print(callable(print)) # True print(callable(net)) # True - 因为 nn.Module 有 __call__ print(callable(42)) # False ``` 只要是 `callable` 的,就可以作为“函数式参数”使用。 --- ### ✅ 总结 | 问题 | 回答 | |------|------| | 函数名能成为参数吗? | ✅ 可以!Python 支持高阶函数 | | 传的是 `func` 还是 `func()`? | ✅ 传 `func`(函数对象),不要加括号 | | 类实例可以当函数传吗? | ✅ 只要实现了 `__call__` 就行(如 `nn.Module`) | | 这有什么用? | ✅ 实现通用逻辑、回调、插件系统、训练流程解耦等 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值