Python评分程序,需要解决范围问题的帮助
这是一个简单的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'
),等等。