Python评分程序,需要解决范围问题的帮助

0 投票
3 回答
518 浏览
提问于 2025-04-18 00:19

这是一个简单的Python程序,它可以接收一个浮点数值,然后返回对应的成绩等级。 我在设置成绩范围时遇到了问题,想要确保根据分数给出正确的等级。请问我这里的问题出在哪里呢...?(我不想使用'and'条件)

def grade(mark):
    if mark >= 80:
        letter = 'A'
    elif 65 >= mark <= 79:
        letter = 'B'
    elif 50 >= mark <= 64:
        letter = 'C'
    else:
        letter = 'F'
    return letter

3 个回答

0

我有点困惑——你说你在使用浮点数...那你想用79.5做什么呢?

if mark >= 80:
    letter = 'A'
elif mark > = 70:
    letter = 'B'

等等……其实你只需要设置下限值就可以了。

5

65 >= mark <= 79 这个写法其实是简化的表达方式,意思是:

65 >= mark and mark <= 79

所有小于65的值也会小于等于79,但这样写并不能找到你真正想要的范围内的值。

你可能想写的是 65 <= mark <= 79

(正如评论中提到的,如果 mark 是一个小数,即使纠正了这个错误,你的函数仍然会出现不连续的情况,因为像79.5这样的有效值就没有被考虑到。)

5

对于超过某个限制的值,提前返回,这样就不需要再测试这个上限了:

def grade(mark):
    if mark >= 80:
        return 'A'
    if mark >= 65:
        return 'B'
    if mark >= 50:
        return 'C'
    return 'F'

你的比较链条的下限设置错了;你在测试 mark 是否 小于 65;把测试条件反过来:

elif 65 <= mark <= 79:
    letter = 'B'
elif 50 <= mark <= 64:
    letter = 'C'

最有效的方法是使用 bisect.bisect() 和两个列表:

import bisect

def grade(mark):
    grades = ['F', 'C', 'B', 'A']
    marks = [50, 65, 80]
    return grades[bisect.bisect(marks, mark)]

bisect.bisect() 会返回一个索引,表示 mark 应该插入的位置;0-49 的值会插入到索引 0(对应 'F'),50-64 的值会插入到索引 1('C'),等等。

撰写回答