2016-10-11 4 views
-1

Итак, я пытаюсь написать небольшой скрипт в python, который будет дифференцировать входы, а когда соответствующий ввод задан, int, он даст корреляционный ответ. Я знаю, что есть несколько сообщений по этой теме, которые похожи, но мне не удалось найти ответ. Вот что у меня есть.Nameerror: name 'h' не определен

oktas = input("Oktas: ") 

def sky_condition(oktas): 
    if isinstance(oktas, int) == True: 
     if oktas == 0: 
     print ("CLR") 
     elif oktas == 1 or oktas == 2: 
     print ("FEW") 
     elif oktas == 3 or oktas == 4: 
     print ("SCT") 
     elif oktas >= 5 and oktas <= 7: 
     print ("BKN") 
     elif oktas == 8: 
     print ("OVC") 
     elif oktas < 0 or oktas > 8: 
     raise ValueError("Oktas provided are above or below the allowed limits.") 
    elif isinstance(oktas, int) == False: 
     raise NameError("You suck at following instructions.") 

skycondition(oktas) 

Когда вы кладете в int или str (как-то в «кавычки»), то он обрабатывает все, как следует. Однако, если я просто положить письмо или слово без кавычек, например, ч, это вызывает ошибку

NameError: name 'h' is not defined 

Он производит ошибку, я хочу, но не так, как я хотел. Как я могу закодировать его, чтобы он поднимет ошибку, как я этого хочу?

+1

Это Python 2? Если это так, вам следует использовать 'raw_input' вместо' input', а затем попытаться преобразовать в целое число с помощью 'int (oktas)'. (также добавьте тег 'python-2.x', потому что это одна область, где поведение отличается от Python 3) – Aurora0001

+0

' isinstance' уже возвращает логическое значение; нет необходимости проверять, совпадает ли это с другим булевым значением, чтобы генерировать * третье * булево значение. – chepner

+0

См. Нюансы 'input' (который является вашей проблемой) в этом другом [stackoverflow answer] (http: // stackoverflow.com/a/15129556/5847976) – jadsq

ответ

3

Несколько вещей, которые не соответствуют вашему коду, я попытаюсь указать на них, исправить их и объяснить вам, что вы делаете неправильно.

oktas = input("Oktas: ") #returns str only if you are running Python 3.x+. 
         #returns int if it's an int for Python 2.x 
         #not sure which version of python you are running. 

def sky_condition(oktas): 
    if isinstance(oktas, int) == True: 
     if oktas == 0: 
     print ("CLR") 
     elif oktas == 1 or oktas == 2: 
     print ("FEW") 
     elif oktas == 3 or oktas == 4: 
     print ("SCT") 
     elif oktas >= 5 and oktas <= 7: 
     print ("BKN") 
     elif oktas == 8: 
     print ("OVC") 
     elif oktas < 0 or oktas > 8: 
     raise ValueError("Oktas provided are above or below the allowed limits.") 
    elif isinstance(oktas, int) == False: 
     raise NameError("You suck at following instructions.") 

sky_condition(oktas) # you had skycondition(oktas) which wasn't your function name. 

В целом эта программа работает, только опечатки на вашем конце. Если вы используете Python 3, вам нужно будет выполнить некоторую проверку ошибок для ввода oktas, так как, как я уже сказал, Python 3.x возвращает str для input(). Вам нужно будет ввести вход с int(oktas), но тогда это в основном победит цель вашего isinstance(), так как это будет int. Хороший способ работы вокруг этого:

if oktas.isdigit(): 
    oktas = int(oktas) 
    #rest of your code 

isdigit() функция возвращает истину, если Обл содержит цифры 0-9 только, то вы можете отдать свой oktas в целом.

Как и в комментарии, если вы используете Python 2.x, вам следует избегать использования input() и использовать raw_input(). Несколько причин:

raw_input() в основном он вернет объект str независимо от того, что вы дадите. Если вы даете ему 5 это даст вам объект ул: "5" Если вы даете ему "5" это даст вам объект ул: "5"

input() это где ваша проблема. В Python 2.x ввод в основном делает eval(input()). Вы можете прочитать здесь eval. В основном он пытается оценить данное выражение. Поскольку числа и строки являются самими выражениями, он попытается запустить ваш вход h как буквально h вместо str. Еще раз используйте raw_input(), чтобы избежать этого в Python 2.x.

Я предполагаю, что вы используете Python 2.x или у вас есть другие коды, которые вы не показываете. Используйте raw_input() и внесите свой вклад соответственно.

+2

Это все еще не касается конкретно, почему входы, такие как 'h', не работают, но' 'h" 'does. Вы должны объяснить, почему это не помогает, чтобы помочь OP понять больше (возможно, упомянуть, что «вход» Python 2 использует 'eval'?) – Aurora0001

+1

Я достаточно отредактировал его. – MooingRawr

 Смежные вопросы

  • Нет связанных вопросов^_^