我正在尝试使用try / except运行一个小程序。它应该在A和F之间返回一个标记,输入值(得分)在0和1之间。当我运行时它按预期工作,即输入0.6它返回D,输入0.72它返回C等等上。如果我输入一个字符串,我会在except语句之后打印错误,因为它应该是。但是,如果我输入一个大于1的数字(超出范围(0-1)),我想在except语句后得到相同的错误,但我得到了A.似乎
score_float >=0.0 and score_float <= 1.0
不起作用。我该怎么解决?感谢
这是脚本:
score = raw_input('Enter score: ')
try:
score_float = float(score)
score_float >=0.0 and score_float <= 1.0
if score_float < 0.6:
print 'F'
elif score_float >= 0.6 and score_float < 0.7 :
print 'D'
elif score_float >= 0.7 and score_float < 0.8 :
print 'C'
elif score_float >= 0.8 and score_float < 0.9 :
print 'B'
else:
print 'A'
except:
print 'Error, the score has to be a float number between 0.0 and 1.0'
答案 0 :(得分:3)
使用比较运算符测试浮点值不会引发异常,因此永远不会到达异常处理程序。 if
语句只是false,并且未选中该分支。
手动提出异常(使用raise ValueError('Value out of range')
或使用其他print
明确处理该情况。
您需要关注引发异常的唯一声明是float()
函数调用。您应该将处理程序限制为仅 的语句,而仅捕获在给定的输入不是float时引发的ValueError
异常。您可以将该点的范围检查组合为仅包含一个打印语句:
score = raw_input('Enter score: ')
try:
score_float = float(score)
if not (0.0 <= score_float <= 1.0):
raise ValueError('Number out of range')
except ValueError:
print 'Error, please enter a valid number between 0.0 and 1.0'
else:
if score_float < 0.6:
print 'F'
elif 0.6 >= score_float < 0.7:
print 'D'
elif score_float < 0.8:
print 'C'
elif score_float < 0.9:
print 'B'
else:
print 'A'
我简化了你的考试;您不需要测试早期if
和elif
测试已经打折的下限。
您可以使用bisect
module将浮点值转换为更简单的字母:
import bisect
names = ['F', 'D', 'C', 'B', 'A']
values = [0.6, 0.7, 0.8, 0.9, float('inf')]
print names[bisect.bisect(values, score_float)]
由于1.0
包含包含在<{1}}中以使二分行正常工作的值,我使用无穷大来匹配最后一个条目。
演示:
'A'