在Python中失败While循环

时间:2013-01-05 05:10:23

标签: python while-loop

我是python的新手(一般编码),但我主要掌握摆在我面前的东西。我正在尝试创建一个只接受整数的输入,所以我将以下函数放在一起:

def askFor(request):
   """Program asks for input, continues to ask until an integer is given"""
   num = ' '
    while (isinstance(num, int) == False):
        num = input(request)
    else:
        return num

当我输入一个数字时它工作正常,但是其他任何东西都会破坏它而不是将它循环回来。我错过了一个元素,或者我最好还是选择

str(input('wargharble: '))

5 个答案:

答案 0 :(得分:4)

你在Python 2中使用raw_input更安全,因为它总会返回一个字符串,而input会尝试评估给定的字符串,这很危险。

def askFor(prompt):
    """ ask for input, continues to ask until an integer is given
    """
    number = None
    while True:
        try:
            number = int(raw_input(prompt))
            break
        except ValueError:
            pass # or display some hint ...
    print(number) # or return or what you need ...

答案 1 :(得分:0)

这是因为input()在非整数输入上失败(这与input()在您输入的字符串上调用eval()的事实有关(参见python builtins })。

raw_input()没有。 (事实上​​,input()会调用raw_input()

请改为尝试:

while True:
    num = raw_input(request)
    if num.isdigit():
        break

isdigit()函数检查字符串中的每个字符是否为数字('0' - '9')

答案 2 :(得分:0)

问题是input()返回被评估为python表达式的原始用户输入。因此,当您在控制台上输入类似“someinput”的内容时,会发生以下情况:

  1. 原始输入从控制台捕获为字符串
  2. 然后将该字符串解析为python表达式(因此,假设您只需在程序中键入此字符串,在这种情况下,它将成为名为“someinput”的变量
  3. 当在这个python表达式上调用isinstance()时,python解释器找不到定义的名为“someinput”的变量 - 因此它会引发异常。
  4. 您真正想要做的是使用raw_input(),这将返回表示用户输入的字符串。既然您现在从控制台接收字符串,则需要某种方法来检查字符串是否为int(因为isinstance将始终返回字符串)

    现在要确定字符串是否为数字,你可以使用像isdigit()这样的东西 - 但要小心 - 这个函数将验证任何只包含数字的字符串(所以0393有效)。

    以下是需要进行的更正:

    def askFor(request):
       """Program asks for input, continues to ask until an integer is given"""
       num = ' '
        while (num.isdigit() == False):
            num = raw_input(request)
        else:
            return num
    

答案 3 :(得分:0)

首先,如果有点关闭你的缩进(while循环的缩进级别与前一级别不匹配)。

def askFor(request):
    """Program asks for input, continues to ask until an integer is given"""
    num, isNum = '', False # multiple assignment
    while not isNum:
        num = input(request)
        if type(num) in (int, long): # if it is any of these
           isNum = True
           break  
        else: isNum = False
    return num # at the end of the loop, it will return the number, no need for an else

另一种方法:

def askFor(request):
    """Program asks for input, continues to ask until an integer is given"""
    num, isNum = '', False
    while not isNum:
        num = raw_input(request)
        try: # try to convert it to an integer, unless there is an error
            num = int(num)
            isNum = True
            break
        except ValueError:
            isNum = False
    return num

答案 4 :(得分:0)

input评估Python代码中输入的内容,因此如果用户输入非敏感内容,则会产生错误。或者更糟,它可以在您的计算机上运行任意命令。通常,您希望使用raw_input并转换它自己安全返回的字符串值。在这里,你只需要在字符串上调用int,如果用户输入非int,它仍然会产生错误,但我们可以通过循环来处理它。

瞧:

def read_int(request):
    while True:
        try:
            return int(raw_input(request))
        except ValueError:
            pass

注意,不需要breakelse;只要你成功解析它就返回值!