Nameerror:名称'h'未定义

时间:2016-10-11 19:09:47

标签: python if-statement input nameerror

所以我试图在python中编写一个小脚本来区分输入,当给出适当的输入int时,它会给出相关的答案。我知道有很多关于这个主题的帖子很相似,但我找不到答案。这就是我所拥有的。

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)

当您输入intstr(如“引号”中的内容)时,它会处理所有内容。但是,如果我只是放一个没有引号的字母或单词,例如h,则会引发错误

NameError: name 'h' is not defined 

它会产生我想要的错误,但不会产生我想要的错误。我怎么能编码它所以它会引起我想要的错误?

1 个答案:

答案 0 :(得分: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为input()返回一个str。您将需要使用int(oktas)转换输入,但这基本上会破坏isinstance()检查的目的,因为它将是一个int。解决这个问题的一个好方法是:

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

如果str仅包含数字0-9,则isdigit()函数返回true,然后您可以将oktas强制转换为int。

如评论所述,如果您使用的是Python 2.x,则应避免使用input()并使用raw_input()。原因如下:

raw_input()基本上它会返回一个str对象,无论你给出什么。如果你给它5,它会给你一个str对象:"5" 如果你给它"5",它会给你一个str对象:"5"

input()这就是你的问题所在。在Python 2.x中,输入基本上是eval(input())。您可以在此处阅读eval。基本上它试图评估给定的表达式。由于数字和字符串本身就是表达式,因此它会尝试按字面h而不是str来运行h输入。再次使用raw_input()在Python 2.x中避免这种情况。

我假设您使用的是Python 2.x,或者您还有其他未显示的代码。使用raw_input()并相应地投射您的输入。