Python GPA计算函数遇非指定数据类型时如何实现错误返回?
如何在Python的GPA计算函数中实现错误返回功能?
针对你提出的calGPAbyLetter函数需求,我们需要处理三类错误场景:传入非字符串类型参数、科目数量超过10门或为空、包含非指定成绩等级(A/B/C/D/F以外的字符)。下面是完整的实现方案,附带详细解释:
核心思路
我们需要在计算GPA前依次完成三项校验,任何一项不通过就返回'Error';全部校验通过后再计算并返回GPA值。具体步骤:
- 先检查输入参数是否为字符串类型,不符合直接返回错误
- 将输入字符串按空格分割为成绩列表,过滤掉多余空格
- 检查成绩数量是否在1~10之间,超出范围返回错误
- 检查每个成绩是否属于允许的等级集合,存在非法等级返回错误
- 计算总分并除以科目数,按示例要求保留合理的小数位数
完整函数实现
def calGPAbyLetter(letters): ''' (str) -> float OR str 接收所有成绩等级字母(限10门科目)并计算GPA。成绩等级仅可为A、B、C、D或F。 >>> calGPAbyLetter("A A A B") 3.75 >>> calGPAbyLetter("A B B B") 3.25 >>> calGPAbyLetter("A B B B A C F A D ") 2.67 >>> calGPAbyLetter("A A A A B B B A C F A D F") 'Error' >>> calGPAbyLetter("A A A A B C F A D F") 2.6 >>> calGPAbyLetter("S A B C F A D F") 'Error' ''' # 定义成绩与分数的映射关系 grade_map = {'A': 4.0, 'B': 3.0, 'C': 2.0, 'D': 1.0, 'F': 0.0} # 校验1:输入必须是字符串类型,处理非指定数据类型的情况 if not isinstance(letters, str): return 'Error' # 分割字符串为成绩列表,自动忽略多余空格(包括开头、结尾的空格) grades = letters.split() # 校验2:科目数量必须在1-10之间 if len(grades) < 1 or len(grades) > 10: return 'Error' # 校验3:所有成绩必须是指定的合法等级 for grade in grades: if grade not in grade_map: return 'Error' # 计算总分和GPA total_points = sum(grade_map[grade] for grade in grades) gpa = total_points / len(grades) # 根据示例格式调整小数位数:整数保留为float,一位小数的保留一位,否则保留两位 if gpa.is_integer(): return float(gpa) elif gpa * 10 % 1 == 0: return round(gpa, 1) else: return round(gpa, 2) # 自动测试示例 if __name__ == "__main__": import doctest doctest.testmod()
关键细节解释
- 非指定数据类型处理:通过
isinstance(letters, str)判断输入类型,若传入数字、列表等非字符串参数,直接返回'Error',避免后续代码引发报错。 - 成绩列表处理:使用
split()而非split(' '),能自动过滤字符串中多余的空格,比如输入末尾带空格、中间多空格的情况都能正确分割出成绩。 - 等级合法性校验:遍历每个成绩,只要发现一个不在
grade_map中的等级,立即返回错误,无需继续后续计算。 - GPA格式适配:通过判断小数部分的特征,返回和示例一致的格式(比如2.6而非2.60,2.67而非2.666...),保证输出的可读性。
内容的提问来源于stack exchange,提问作者Naruethep Khanijoh
相关产品推荐
相关产品推荐

