2014-10-17 46 views
-2
score = raw_input("Enter a score between 0.0 and 1.0:") 

float(score) 

#if score < 0.0: 
    #print "Invalid input." 
    #exit 

#elif score > 1.0: 
    #print "Invalid input." 
    #exit 

if score >= .9: 
    print "A" 

elif score >= .8: 
    print "B" 

elif score >= .7: 
    print "C" 

elif score >= .6: 
    print "D" 

elif score < .6: 
    print "F" 

else: 
    print "Invalid input." 

我遇到了上面的python代码的麻烦;我最初的if语句似乎有些错误,但我似乎无法弄清楚什么。无论我测试什么输入,它总是返回A作为输出。任何指针,我做错了会很好,对于这样一个简单的问题抱歉,但我刚刚开始学习python,我一直盯着这个代码一个多小时,我无法弄清楚我的生活为什么它不工作。谢谢。python初学者,如果声明

回答

1

您需要的float()呼叫的返回值分配回score

score = float(score) 

score开始作为一个字符串,不可变对象,它会不会就地转化。 float()返回一个新的浮点对象,并且您忽略该返回值。

而不是使用5条if语句,你可以使用bisect module的值映射到一个字母:

import bisect 

score = float(raw_input("Enter a score between 0.0 and 1.0:")) 

scores = [0, .6, .7, .8, .9] 
grades = ['F', 'D', 'C', 'B', 'A'] 

print grades[bisect.bisect(scores, score) - 1] 

对于任何给定的分数,bisect.bisect()将后返回插入点到scores列表最接近的较低或相等的值;所以对于.9它将返回5,以便在最后插入值,但对于0到(但不包括)0.6的任何内容,它将返回1

您只需要减去1并使用相同的索引进入grades列表,而不是获得相应的等级。

演示:

>>> import bisect 
>>> scores = [0, .6, .7, .8, .9] 
>>> grades = ['F', 'D', 'C', 'B', 'A'] 
>>> bisect.bisect(scores, .75) 
3 
>>> grades[bisect.bisect(scores, .75) - 1] 
'C' 
>>> grades[bisect.bisect(scores, .25) - 1] 
'F' 
>>> grades[bisect.bisect(scores, .9) - 1] 
'A' 
1

这实际上并不改变变量scorefloat

float(score) 

您必须分配回score

score = float(score) 

或者只是做所以你输入变量

score = float(raw_input("Enter a score between 0.0 and 1.0:")) 
0

只是将该值再次保存在分数中。

score = float(score)