Python计算普通/加权成绩平均时空列表除零报错解决方法
问题根因
所有除零报错的核心触发逻辑一致:列表未存入任何有效成绩时,直接执行了除法运算。
- 空列表调用
len()返回0,作为除数必然触发ZeroDivisionError - 预先向列表插入占位值1的方案不可行,占位值会被纳入成绩统计,直接导致平均分计算结果失真
- 双列表场景下
if mathslistx1 and mathslistx2:判断不生效,是因为该逻辑要求两个列表必须同时非空才会执行计算,只要任意一个列表为空就会跳过;同时你当前使用的加权公式中对sum()、len()统一减1的写法,是之前插入占位值1遗留的错误逻辑,移除占位值后这部分减1操作也必须同步删除。
修复方案
单列表普通平均分场景
你原有代码的执行顺序本身就有问题:进入函数先计算平均分,再接收用户输入的新成绩,这也是首次运行直接报错的直接原因。修复时只需在计算平均分前增加空列表判断,列表为空时直接展示无成绩提示即可,不需要插入任何占位值。
修复后可运行代码:
mathslist = [] def gradesstart(): # 先判断列表是否有有效成绩,再执行计算 if not mathslist: mathsgrade = "暂无成绩记录" else: mathsgrade = round(sum(mathslist) / len(mathslist), 2) # 保留两位小数符合常规成绩展示需求 print(f'''Gradeoverview: Maths: {mathsgrade}''') subject = input("For which subject you want to add a grade? ") if subject == "Maths": mathslist.append(int(input("Which grade you want to add? "))) print("Your grade overview has been updated!") gradesstart() gradesstart()
双列表加权平均分场景
这里不要硬编码加权公式,也不要强制要求两个列表同时非空才计算。正确的处理逻辑是分别判断每个权重对应的成绩列表,有有效成绩就累计对应加权分数和总权重,最后用总加权分数除以总权重得到平均分,从根源上规避除零问题,同时兼容仅单个权重有成绩的场景。
修复后的计算逻辑代码:
mathslistx1 = [] # 存储权重为1的成绩 mathslistx2 = [] # 存储权重为2的成绩 def calc_maths_weighted_grade(): total_weighted_score = 0 total_weight = 0 # 单独判断权重1的成绩列表 if mathslistx1: avg_x1 = sum(mathslistx1) / len(mathslistx1) total_weighted_score += avg_x1 * 1 total_weight += 1 # 单独判断权重2的成绩列表 if mathslistx2: avg_x2 = sum(mathslistx2) / len(mathslistx2) total_weighted_score += avg_x2 * 2 total_weight += 2 # 总权重为0说明两个列表都为空 if total_weight == 0: return "暂无成绩记录" # 最终加权平均分 = 总加权分数 / 总权重,无需硬编码除以3 return round(total_weighted_score / total_weight, 2)
你只需要在原来的成绩展示位置调用calc_maths_weighted_grade()即可拿到正确结果,无论列表为空、仅单个列表有值、两个列表都有值,都不会触发除零错误。
内容的提问来源于stack exchange,提问作者Toschi-07
相关产品推荐
相关产品推荐

