尝试限制数据类型输入时出现问题

时间:2015-05-04 12:13:08

标签: python

您好我在python中创建的函数有这个问题:

def intcheck(num)
    if isinstance(num, int):
        return num
    else:
        intcheck(input("Invalid datatype: Input integer only: "))

它应该检查输入是否是一个整数,如果它不是,请询问用户另一个输入,然后检查一个,等等。等。

然而,代码似乎停留在else:语句上,这样即使正确的输入也不会返回,它只会无限期地请求另一个输入。

4 个答案:

答案 0 :(得分:1)

更简单的方法是:

def is_int(foo):
   try:
      return int(foo)
   except ValueError:
      print('{} is not a number'.format(foo))
      return is_int(input('Please enter a number: '))

如果您使用的是Python 2,请确保使用raw_input代替input

答案 1 :(得分:1)

如果您使用的是Python 3.x,input()会返回一个字符串,因此您必须将其转换为int。如果您使用的是Python 2.x,那么真的应该使用raw_input()代替(Python 2.x input()非常不安全),并且raw_input()与Python 3.x input()相同,您还必须将字符串转换为int。

在这两种情况下,您需要在else子句中返回递归调用的结果,如其他答案所示。

现在以这种方式使用递归,虽然可能是“优雅”,但这不是最简单的解决方案 - 一个好的旧循环工作正常并避免堆叠帧(Python不进行尾递归优化):

def checkint():
    while True:
        num = input("your prompt here")
        try:
            return int(num)
        except ValueError:
            print "'{}' is not a valid integer".format(num)

答案 2 :(得分:0)

您忘记了input函数返回str个对象!所以,你永远循环在intcheck函数的else中。相反,你可以这样做:

def intcheck(num):
    if isinstance(num, int):
        return num
    else:
        input_string = input("Invalid datatype: Input integer only: ")
        try:
            input_int = int(input_string)
        except ValueError:
            input_int = input_string
        finally:
            intcheck(input_int)

答案 3 :(得分:0)

Python中的输入始终作为字符串加载,因此首先,您需要将输入转换为一个。优雅的方法是检查它是否有异常:如果是int,则返回它,如果没有,请求另一个输入。

def intcheck(num):
    try:
        return int(num)
    except ValueError:
        return intcheck(input("That is not a integer, please enter integer: "))