编写Python程序:排除指定科目计算成绩平均值(保留两位小数)
问题描述
编写Python程序,接收一个参数(科目名称),计算并输出排除该科目后的成绩平均值,结果保留两位小数。
给定字典:
grades = {'Biology':80, 'Physics':88, 'Chemistry':98, 'Math':89, 'English':79, 'Music':67, 'History':68, 'Art':53, 'Economics':95, 'Psychology':88}
示例:
- 当参数为Biology时,应输出80.56
- 当参数为Chemistry时,应输出78.56
用户错误代码
import sys grades = {'Biology':80, 'Physics':88, 'Chemistry':98, 'Math':89, 'English':79, 'Music':67, 'History':68, 'Art':53, 'Economics':95, 'Psychology':88} def average_grade(): key = sys.argv[1] included_keys = grades.pop(key) average = sum(included_keys)/len(included_keys) return round(average, 2) average_grade()
错误分析与修正
错误点:
grades.pop(key)返回的是对应科目的分数(整数),而非剩余的成绩集合,直接对整数调用sum()和len()会触发类型错误。- 使用
pop()会修改原字典,若多次运行程序会导致字典内容丢失。 - 未处理输入科目不存在的情况,会引发
KeyError。 - 函数仅返回结果但未打印,运行后看不到输出。
修正后的代码
import sys grades = {'Biology':80, 'Physics':88, 'Chemistry':98, 'Math':89, 'English':79, 'Music':67, 'History':68, 'Art':53, 'Economics':95, 'Psychology':88} def average_grade(): if len(sys.argv) < 2: print("请输入科目名称作为参数") return key = sys.argv[1] if key not in grades: print(f"科目 {key} 不存在") return total = sum(grades.values()) - grades[key] count = len(grades) - 1 average = total / count # 格式化输出确保严格保留两位小数 print("{0:.2f}".format(average)) average_grade()
说明:
- 先检查参数是否传入,避免索引错误。
- 判断输入科目是否在字典中,防止
KeyError。 - 通过总和减去目标科目分数、总数量减1来计算平均值,不修改原字典。
- 使用字符串格式化确保输出严格保留两位小数,避免round函数的精度问题(例如某些情况下round可能得到80.55而非80.56)。
内容的提问来源于stack exchange,提问作者gtmailster
相关产品推荐
相关产品推荐

