1

我对 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: '))
4

5 回答 5

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 ...
于 2013-01-05T05:22:16.127 回答
0

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

  1. 原始输入从控制台捕获为字符串
  2. 然后将该字符串解析为 python 表达式(因此假设您只需将该字符串输入到您的程序中,在这种情况下,它就变成了一个名为“someinput”的变量
  3. 当在这个 python 表达式上调用 isinstance() 时,python 解释器找不到定义的名为“someinput”的变量 - 所以它抛出一个异常。

你真正想做的是使用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
于 2013-01-05T05:30:53.020 回答
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
于 2013-01-05T05:36:24.600 回答
0

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

raw_input()才不是。(实际上,input()调用raw_input()

试试这个:

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

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

于 2013-01-05T05:23:57.173 回答
0

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

瞧:

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

注意,不需要breakor else; 成功解析后只需返回值!

于 2013-01-05T08:44:58.787 回答