You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()函数修复方案

针对原逻辑的修复点如下:

  1. 提前初始化average_score_list、total_score_list两个全局列表存储计算结果
  2. 补全第一个输出循环的漏写字段:英语、计算机、总分、平均分
  3. 在第一个输出循环末尾添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 07:15:05