Python成绩处理程序无报错但失效问题及代码调试求助
问题排查与修正:Python成绩处理程序无功能输出问题
需求与要求
需要实现的功能:读取grades.txt中的学生ID与成绩,计算每位学生的平均分,输出结果并将ID和平均分写入gradeAverage.txt。
教授明确要求:
- 禁止使用全局变量
- 程序必须包含
main函数,以及一个接收三门成绩为参数、计算并返回平均分的函数 - 支持未知数量的学生条目
- 输出匹配样例格式
- 平均分格式化为两位小数
- 使用循环读取学生记录
现有代码问题分析
你的代码虽未报错,但核心逻辑存在多处致命错误,导致程序卡在文件读取阶段,后续代码完全无法执行:
文件读取逻辑崩溃
- 在
for line in infile循环内,每次迭代都重置student_IDs和gradeList为空列表,之前读取的数据会被直接清空 - 嵌套的
while line != ''循环未更新line的值,会无限重复处理第一行数据,程序彻底卡在这一步,后续代码永远无法运行
- 在
未定义变量与变量名错误
- 使用了
grades、old、Velocity等未定义的变量 - 打印语句中用了
student_IDS(大写S),但前面定义的是student_IDs(小写s),大小写不匹配 newfile=gradeAverage.txt未给文件名加引号,属于语法错误(因程序未走到这一步才未触发报错)
- 使用了
平均分计算函数不符合要求
- 教授要求函数接收三门成绩为参数,但你的
grade_average接收的是列表和人数,逻辑完全偏离要求 sum(newlist)若传入子列表会直接报错,因为列表无法直接求和
- 教授要求函数接收三门成绩为参数,但你的
文件写入与打印逻辑错误
- 写入文件时误用
newfile.write,实际打开的文件对象是outfile - 打印语句硬编码3个学生的输出,不支持未知数量的条目
- 写入文件时误用
修正后的代码
以下是完全符合要求的修正代码:
def calculate_average(grade1, grade2, grade3): """接收三门成绩,计算并返回平均分""" return (grade1 + grade2 + grade3) / 3 def main(): # 读取输入文件 try: with open('grades.txt', 'r') as infile: student_records = [] current_id = None current_grades = [] for line in infile: line = line.strip() # 去除首尾空白(包括换行符) if not line: continue # 跳过空行 # 判断当前行是学生ID还是成绩(假设ID以M开头,可根据实际格式调整) if line.startswith('M'): # 保存上一个学生的记录(如果存在完整的三门成绩) if current_id and len(current_grades) == 3: avg = calculate_average(*current_grades) student_records.append((current_id, avg)) current_grades = [] current_id = line else: # 转换成绩为数值类型 try: grade = float(line) current_grades.append(grade) except ValueError: print(f"警告:无法解析成绩 '{line}',已跳过") # 处理最后一个学生的记录 if current_id and len(current_grades) == 3: avg = calculate_average(*current_grades) student_records.append((current_id, avg)) except FileNotFoundError: print("错误:未找到grades.txt文件") return # 输出结果并写入文件 with open('gradeAverage.txt', 'w') as outfile: for student_id, avg in student_records: formatted_avg = "{0:.2f}".format(avg) # 打印到控制台 print(f"Student {student_id} average is {formatted_avg}") # 写入文件(制表符分隔) outfile.write(f"{student_id}\t{formatted_avg}\n") if __name__ == "__main__": main()
代码说明
- 使用
with语句自动管理文件生命周期,避免资源泄漏 calculate_average函数严格符合要求:接收三个成绩参数,返回平均分- 循环读取文件时动态收集每个学生的ID和三门成绩,支持任意数量的学生条目
- 处理空行和无效成绩的异常情况,提升程序鲁棒性
- 平均分格式化为两位小数,输出同时覆盖控制台打印与文件写入
- 完全未使用全局变量,符合教授要求
内容的提问来源于stack exchange,提问作者Demonic Printer
相关产品推荐
相关产品推荐

