2015-01-15 2 views
-1

Я пытаюсь запустить небольшую программу с помощью try/except. Он должен возвращать отметку между A и F для входного значения (оценка) между 0 и 1. Когда я запускаю его, он работает так, как следует, iefor ввод 0.6 возвращает D, для входа 0.72 он возвращает C и так на. Если я введу строку, я получаю сообщение об ошибке, которое выдается после оператора except, как должно быть. Но если я печатаю несколько выше, чем 1 (который находится вне диапазона (0-1)) Я хотел бы получить ту же ошибку после того, кроме заявления, но я получаю А. Кажется, чтоДругие условия в try/except construct python

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'  

ответ

3

Тестирование значения с плавающей точкой с операторами сравнения не вызывает исключение, так что ваш обработчик исключений никогда не достигается. Оператор if просто неверен и эта ветвь не выбрана.

Либо вызвать исключение вручную (с помощью raise ValueError('Value out of range') или обрабатывать этот случай явно с другим print.

Единственного утверждением, что вы должны заботиться о повышении исключения, является вызовом 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 является включены в значениях, которые сопоставляются с 'A' для бисекция корректной работы, я использовал бесконечность в соответствуют последней записи.

Демо:

>>> import bisect 
>>> names = ['F', 'D', 'C', 'B', 'A'] 
>>> values = [0.6, 0.7, 0.8, 0.9, float('inf')] 
>>> bisect.bisect(values, 0.72) 
2 
>>> names[bisect.bisect(values, 0.72)] 
'C' 
>>> bisect.bisect(values, 0.9) 
4 
>>> names[bisect.bisect(values, 0.9)] 
'A' 
Смежные вопросы