Python中如何让用户输入多个值传递给带可变参数的自定义函数
原函数隐患修复
你当前编写的score函数存在两个小问题,建议先修复避免后续报错:
- 遍历
**quiz的循环每次都会覆盖e的值,只会生效最后一个传入的关键字参数值- 如果没有传入任何关键字参数或作业参数,会出现变量未定义的报错
修复后的函数参考:
def score(midterm, final, practice, *assignments, **quiz): a = 0.25 * midterm b = 0.25 * final c = 0.2 * practice # 计算作业加权分 if not assignments: d = 0 else: avg_assign = sum(assignments)/len(assignments) d = 0.05 * avg_assign # 计算quiz加权分,和原有逻辑保持一致取第一个关键字参数值 e = 0 if quiz: e = 0.25 * list(quiz.values())[0] return a + b + c + d + e
手动输入参数实现方案
if __name__ == '__main__': # 收集3个固定位置参数 midterm = int(input("请输入期中成绩:")) final = int(input("请输入期末成绩:")) practice = int(input("请输入练习成绩:")) # 收集不定数量的作业成绩,支持任意个输入 assign_input = input("请输入作业成绩,多个成绩用空格分隔:") assignments = list(map(int, assign_input.strip().split())) # 收集quiz参数 quiz_score = int(input("请输入quiz成绩:")) quiz_dict = {"quiz": quiz_score} # 参数解包调用函数 total = score(midterm, final, practice, *assignments, **quiz_dict) print(f"最终成绩:{total:.2f}")
逻辑说明
- 作业输入时按照提示输入任意数量的数值,用空格分隔即可,输入1个就对应1次作业,输入3个就对应3次作业,自动适配数量
- 调用函数时用
*对作业列表解包、**对quiz字典解包,完全匹配原函数的参数定义
内容的提问来源于stack exchange,提问作者Newb
相关产品推荐
相关产品推荐

