Python学生成绩统计代码校验、display函数修复及代码优化咨询
Python学生成绩统计代码问题解答
1、原代码正确性与其他初始化方式
原代码存在的错误
原代码无法正常运行,核心问题如下:
- 语法错误:顶层列表初始化缩进错误、英语分数输入行存在多余的
`enter code here`标记、check_score/total_score函数未定义、average_score_list未初始化 - 逻辑错误:数学分数校验逻辑错误(直接判断分数等于1才通过,不符合0-100的校验要求)、
get_stud_data函数循环变量i未自增导致死循环、display函数第一个输出循环未给i自增导致死循环 - 功能缺失:
display函数漏输出英语、计算机、总分、平均分四个字段
其他初始化方式
不需要用分散的5个平行列表存储数据,更易维护的初始化方式有两种:
- 字典列表:每个学生的所有信息存在一个字典里,所有学生存为列表,例如
students = [{"name":"张三","math":90,"science":85,...}, ...] - 嵌套列表:每个学生的信息存为子列表,所有学生存为外层列表,例如
students = [["张三",90,85,88,95], ...]
2、display()函数修复方案
针对原逻辑的修复点如下:
- 提前初始化
average_score_list、total_score_list两个全局列表存储计算结果 - 补全第一个输出循环的漏写字段:英语、计算机、总分、平均分
- 在第一个输出循环末尾添加
i += 1避免死循环
修复后的核心代码片段:
# 提前补充计算总分的函数和全局列表初始化 total_score_list = [] average_score_list = [] def total_score(math, sci, eng, comp): total = math + sci + eng + comp total_score_list.append(total) return total def check_score(score): return 1 if 0 <= score <= 100 else 0 # 修复后的display函数 def display(): i = 0 l_size = n - 1 print("\n\n{:<10}\n".format("Class Record")) print("{:<10} {:<10} {:<10} {:<10} {:<10} {:<10} {:<10}".format("Student","Math","Science","English","Computer","Total","Average")) while i <= l_size: print("{:<10} {:<10} {:<10} {:<10} {:<10} {:<10} {:<10.1f}".format( stud_name_list[i], math_score_list[i], science_score_list[i], english_score_list[i], computer_score_list[i], total_score_list[i], average_score_list[i] )) i += 1 i = 0 print("\n{:<10}".format("Histogram")) while i <= l_size: hist = int(average_score_list[i]/5) print("{:<10} {}".format(stud_name_list[i], '#'*hist)) i += 1
3、内置数据结构+嵌套循环最简实现
用字典列表+嵌套循环实现,完全复用逻辑,无重复代码,代码量减少60%以上:
SUBJECTS = ["数学", "科学", "英语", "计算机"] def input_score(subject): while True: s = int(input(f"{subject}分数:")) if 0 <= s <= 100: return s print("分数错误,请输入0-100之间的数值") # 主逻辑 n = int(input("学生人数:")) students = [] for i in range(n): print(f"\n第{i+1}位学生") stu = {"姓名": input("姓名:")} total = 0 for sub in SUBJECTS: score = input_score(sub) stu[sub] = score total += score stu["总分"] = total stu["平均分"] = total / len(SUBJECTS) students.append(stu) # 输出 print("\n\n班级成绩表") header = ["姓名"] + SUBJECTS + ["总分", "平均分"] print("".join([f"{h:<10}" for h in header])) for stu in students: print("".join([f"{stu[h]:<10}" if h != "平均分" else f"{stu[h]:<10.1f}" for h in header])) print("\n直方图") for stu in students: print(f"{stu['姓名']:<10} {'#' * int(stu['平均分']/5)}")
4、这类代码的最佳实践
- 关联数据绑定存储:不要用多个平行列表存储同一实体的不同属性,用字典/数据类绑定,避免索引错位导致的数据混乱
- 重复逻辑抽取复用:相同的输入、校验、计算逻辑抽取为公共函数,不要重复写多份,降低修改成本
- 减少全局变量使用:数据尽量通过函数参数、返回值传递,避免全局变量被意外修改导致的排查困难
- 循环逻辑简化:能用
for循环遍历的场景不要用while+索引变量,避免漏写自增导致死循环 - 输入校验统一:所有输入校验逻辑集中处理,不要硬编码分散在各个位置
- 输出格式化简化:批量生成表头、表内容,不要多次重复调用
print写死格式
内容的提问来源于stack exchange,提问作者Thirdz ph
相关产品推荐
相关产品推荐

