Python编写GPA计算程序时for循环执行if后停止的问题
问题根因
你的代码有3个核心逻辑错误,导致无法正常运行:
- 变量名冲突:你预先定义了
score = []用来存转换后的分值,但for score in range(length)直接把循环生成的整数索引覆盖了这个列表变量,后续所有对score的操作都作用在整数上,根本碰不到你一开始建的空列表。 - 判断对象错误:循环里的所有if条件都在判断整个letters列表是不是等于单个元素的列表(比如
['A']),从来没有取出当前遍历到的单个字母做判断,所有条件永远不成立。 - 类型不匹配:就算条件碰巧命中,整数和列表做
+拼接会直接触发类型错误,根本无法执行追加元素的操作。
另外原代码没有处理G、E这类不在A-F范围内的非法等级,也没有做总分计算的逻辑。
修正后可运行代码
letters = ['A', 'B' ,'C', 'D', 'F', 'G', 'E'] score_list = [] # 先定义字母等级和对应分值的映射关系 grade_point = { 'A': 4.0, 'B': 3.0, 'C': 2.0, 'D': 1.0, 'F': 0.0 } # 直接遍历等级列表里的每个元素,不需要通过长度取索引 for single_grade in letters: if single_grade in grade_point: score_list.append(grade_point[single_grade]) else: # 遇到非法等级打印提示,可根据作业要求调整为按0分计算等逻辑 print(f"跳过无效等级:{single_grade}") total = sum(score_list) print(f"各等级对应分值:{score_list}") print(f"总分:{total}")
逻辑说明
- 存储分值结果的列表改名为
score_list,和循环变量区分开,避免变量覆盖问题。 - 直接迭代输入的等级列表取单个元素判断,不用绕一层索引取值,写法更简洁不容易出错。
- 用字典存储等级和分值的对应关系,替代冗余的多段elif判断,后续要调整分值对应关系只需要改字典内容即可。
- 增加非法等级兼容逻辑,遇到不在规则内的等级不会中断程序运行。
- 最后用内置
sum()函数直接计算分值列表的总和,输出要求的总分结果。
内容的提问来源于stack exchange,提问作者Hannie
相关产品推荐
相关产品推荐

