如何修改gp函数以处理带+/-的成绩并返回对应绩点
搞定GPA成绩转换函数的小技巧
嘿,我来帮你把这个gp函数改好!首先得先指出你当前代码里的问题:每个return语句执行后,函数就直接结束了,所以你定义完A=4之后return A,后面的B、C、D、F相关的代码根本不会被运行,而且最后一行的return f里的f是小写,但你定义的变量是大写F,这会触发NameError哦。
接下来给你两种符合需求的实现方式,对应你提到的两种思路:
方法一:用多个elif分支明确处理每个情况
这种方式非常直观,适合刚上手的朋友理解,每个成绩(包括带+/-的)都有明确的判断分支:
def gp(s): if s == 'A+': return 4.3 elif s == 'A': return 4.0 elif s == 'A-': return 3.7 elif s == 'B+': return 3.3 elif s == 'B': return 3.0 elif s == 'B-': return 2.7 elif s == 'C+': return 2.3 elif s == 'C': return 2.0 elif s == 'C-': return 1.7 elif s == 'D+': return 1.3 elif s == 'D': return 1.0 elif s == 'D-': return 0.7 elif s == 'F': return 0.0 else: # 处理无效输入,比如输入了X或者其他奇怪的内容 raise ValueError("Invalid grade format")
测试一下你给的例子:
>>> gp('A-') 3.7 >>> gp('B+') 3.3
完全符合要求~
方法二:用startswith/endswith简化逻辑
这种方式更简洁,尤其是以后如果要调整基础分或者扩展等级,维护起来更方便:
def gp(s): # 先定义基础字母对应的分数 base_scores = {'A': 4.0, 'B': 3.0, 'C': 2.0, 'D': 1.0, 'F': 0.0} # 获取成绩的字母部分(假设输入格式正确,第一个字符是字母) grade_letter = s[0] if grade_letter not in base_scores: raise ValueError("Unknown grade letter") score = base_scores[grade_letter] # 根据后缀调整分数 if s.endswith('+'): # 通常F没有+的情况,这里做个校验 if grade_letter == 'F': raise ValueError("F grade doesn't support '+' suffix") score += 0.3 elif s.endswith('-'): # 同样,F也没有-的情况 if grade_letter == 'F': raise ValueError("F grade doesn't support '-' suffix") score -= 0.3 return score
这个版本的逻辑是先拿到基础分,再根据后缀做加减,代码量少很多,而且扩展性更强。
你可以根据自己的需求选其中一种方式,两种都能完美处理带+/-的成绩转换~
内容的提问来源于stack exchange,提问作者Mdot
相关产品推荐
相关产品推荐

