函数参数的解包与顺序匹配机制
函数参数的解包与顺序匹配机制
- 使用 * 顺序传参
- 使用 ** 按名称传参
使用 * 顺序传参
星号 * 表示序列解包,train_data 应该是一个有序的序列(如 list、tuple、或者 np.ndarray 的元组结构),解包后将按顺序传入函数的剩余位置参数。
train_data = (a, # 学生能力e, # 练习题IDc, # 回答正确情况it, # 交互时间at, # 学生属性diff, # 题目难度pc, # 知识点主成分skill_forget # 知识遗忘信息
)train_one_epoch(self.lpkt_net, optimizer, criterion, self.batch_size, *train_data)#等价于手动写成:train_one_epoch(self.lpkt_net, optimizer, criterion, self.batch_size,a, e, c, it, at, diff, pc, skill_forget)
使用 ** 按名称传参
💡 注意:加了 *, 表示从 a_data 开始的所有参数必须使用关键字传参!
def train_one_epoch(net, optimizer, criterion, batch_size, *,a_data=None, e_data=None, c_data=None,it_data=None, at_data=None, diff_data=None,pc_data=None, skill_forget_data=None):print("a_data:", a_data)print("e_data:", e_data)print("c_data:", c_data)data_dict = {"a_data": [1, 2, 3],"e_data": [101, 102, 103],"c_data": [1, 0, 1],"it_data": [10, 20, 30],"at_data": [0.5, 0.6, 0.7],"diff_data": [0.2, 0.3, 0.4],"pc_data": [0.1, 0.2, 0.3],"skill_forget_data": [0, 1, 0]
}train_one_epoch(net="模型", optimizer="优化器", criterion="损失函数", batch_size=32, **data_dict
)
✅ 输出结果:
a_data: [1, 2, 3]
e_data: [101, 102, 103]
c_data: [1, 0, 1]
...
你会发现,即使你换了 data_dict 中键的顺序,也能正确传入对应参数,只要键名与函数参数名一致即可。