Python新手基于类与while循环实现5名学生成绩录入,如何计算全体总平均分及代码优化
代码问题排查与优化实现
现有代码的待优化点
- 类
Marks的定义被嵌套在while循环内部,每轮循环都会重复定义同一个类,造成不必要的资源开销,类作为实例模板应该只在全局定义一次 - 缺少跨循环的累加变量存储每个学生的平均成绩,无法支撑最终整体平均的计算
- 单个学生的平均成绩计算逻辑硬编码在打印输出的
output()方法中,无法独立获取计算结果用于后续统计
核心功能实现步骤(解决整体平均计算的问题)
- 将
Marks类的定义移出循环,仅做一次全局定义 - 在循环启动前初始化全局累加变量
total_avg_sum = 0,专门用于累计每一位学生的平均成绩 - 拆分类的方法逻辑:新增独立的
get_individual_avg()方法,专门计算并返回单个学生的平均成绩,和打印输出逻辑解耦 - 每完成一名学生的信息录入,调用方法获取其平均成绩,累加到全局累加变量中
- 所有学生录入完成后,用累加的总平均值除以学生总数,即可得到5名学生的整体平均成绩
优化后的完整可运行代码
# 全局定义学生成绩类,仅初始化一次 class Marks(): def __init__(self, name, english_marks, hindi_marks, science_marks, economics_marks): self.name = name self.english_marks = english_marks self.hindi_marks = hindi_marks self.science_marks = science_marks self.economics_marks = economics_marks # 独立方法:计算返回单个学生的平均成绩 def get_individual_avg(self): return (self.english_marks + self.hindi_marks + self.science_marks + self.economics_marks) / 4 # 独立方法:打印单个学生的成绩信息 def output(self): print("\n") print(f"Hi {self.name.title()}") print(f"Your average score is {self.get_individual_avg():.2f}") print("\n") # 初始化统计变量 total_avg_sum = 0 STUDENT_TOTAL = 5 # 固定录入5名学生 entry = 1 while entry <= STUDENT_TOTAL: # 录入当前学生的信息 name = input("Enter your name: ") english_marks = int(input("Enter your English score: ")) hindi_marks = int(input("Enter your Hindi score: ")) science_marks = int(input("Enter your science score: ")) economics_marks = int(input("Enter your economics score: ")) # 创建当前学生的类实例 current_student = Marks(name, english_marks, hindi_marks, science_marks, economics_marks) # 打印当前学生的成绩 current_student.output() # 累加当前学生的平均成绩到总统计值 total_avg_sum += current_student.get_individual_avg() entry += 1 # 计算并输出所有学生的整体平均成绩 overall_avg = total_avg_sum / STUDENT_TOTAL print("="*30) print(f"Overall average score of all {STUDENT_TOTAL} students is: {overall_avg:.2f}")
额外优化说明
- 累加变量
total_avg_sum必须定义在循环外部,一旦放在循环内部,每轮循环都会重新把变量初始化为0,永远无法累计之前循环的统计值 - 把固定常量(比如学生总人数)定义为大写命名的全局变量,后续如果要调整录入学生的数量,只需要修改常量值即可,不需要改动循环逻辑
- 用格式化字符串输出时增加小数位控制,避免成绩显示出现过长的浮点数
- 拆分类方法的设计符合单一职责原则,后续如果需要调整成绩计算规则(比如新增考试科目、调整不同科目的权重),只需要修改
get_individual_avg()方法,不会影响打印输出的逻辑
内容的提问来源于stack exchange,提问作者DevRishi
相关产品推荐
相关产品推荐

