如何将用户输入限制为仅Python中的整数

时间:2014-04-27 16:43:36

标签: python-3.x

我正在尝试进行多项选择调查,允许用户从1-x选项中进行选择。如何让用户输入除数字之外的任何字符,返回“这是无效答案”之类的内容

def Survey():
    print('1) Blue')
    print('2) Red')
    print('3) Yellow')
    question = int(input('Out of these options\(1,2,3), which is your favourite?'))
    if question == 1:
        print('Nice!')
    elif question == 2:
        print('Cool')
    elif question == 3:
        print('Awesome!')
    else:
        print('That\'s not an option!')

8 个答案:

答案 0 :(得分:8)

您的代码将变为:

def Survey():

    print('1) Blue')
    print('2) Red')
    print('3) Yellow')

    while True:
        try:
            question = int(input('Out of these options\(1,2,3), which is your favourite?'))
            break
        except:
            print("That's not a valid option!")

    if question == 1:
        print('Nice!')
    elif question == 2:
        print('Cool')
    elif question == 3:
        print('Awesome!')
    else:
        print('That\'s not an option!')

它的工作方式是它创建一个无限循环的循环,直到只输入数字。所以说我把'1',它会破坏循环。但是,如果我把'Fooey!' WOULD引发的错误被except语句捕获,并且因为它没有被破坏而循环。

答案 1 :(得分:3)

最好的方法是使用一个辅助函数,该函数可以接受变量类型以及输入消息。

def _input(message,in_type=str):
    while True:
      try:
        return in_type (input(message))
    except:pass

if __name__ == '__main__':
    _input("Only accepting integer : ",int)
    _input("Only accepting float : ",float)
    _input("Accepting anything as string : ")

因此,当您想要一个整数时,您可以传递它,即我只想要整数,以防万一您可以接受浮点数,则可以将浮点数作为参数传递。它将使您的代码真正苗条,因此,如果您必须输入10次,则不想编写try catch块十次。

答案 2 :(得分:2)

def func():
    choice = "Wrong"
    
    while choice.isdigit()==False :
        choice = input("Enter a number: ")
        
        if choice.isdigit()==False:
            print("Wrongly entered: ")
        else:
            return int(choice)

答案 3 :(得分:1)

其中一个解决方案:使用type函数或isinstance函数检查您是否有intfloat或其他类型

>>> type(1)
<type 'int'>

>>> type(1.5)
<type 'float'>

>>> isinstance(1.5, int)
False

>>> isinstance(1.5, (int, float))
True   

答案 4 :(得分:1)

我会首先捕获ValueError(非整数)异常并检查答案是否可接受(1,2,3内)或引发另一个ValueError异常

def survey():
    print('1) Blue')
    print('2) Red')
    print('3) Yellow')

    ans = 0
    while not ans:
        try:
            ans = int(input('Out of these options\(1, 2, 3), which is your favourite?'))
            if ans not in (1, 2, 3):
                raise ValueError
        except ValueError:
            ans = 0
            print("That's not an option!")

    if ans == 1:
        print('Nice!')
    elif ans == 2:
        print('Cool')
    elif ans == 3:
        print('Awesome!')
    return None

答案 5 :(得分:1)

根据我的说法,最好的方法是使用一个辅助函数,它可以接受一个变量类型以及要输入的消息。

    def _input(message,in_type=str):
        while True:
          try:
            return in_type (input(message))
        except:pass

    if "__main__":
        _input("Only accepting integer : ",int)
        _input("Only accepting float : ",float)
        _input("Accepting anything as string : ")` 

所以当你想要一个整数时,你可以传递它我只想要整数,以防你可以接受浮点数你传递浮点作为参数。它会使你的代码变得非常小,所以如果你需要输入10次,你不想写try catch块十次。

答案 6 :(得分:0)

<块引用>

您可以使用名为 PyInputPlus 的模块

安装

<块引用>

pip 安装 PyInputPlus

您可以将其用作

def Survey():
    print('1) Blue')
    print('2) Red')
    print('3) Yellow')
    question = int(input('Out of these options\(1,2,3), which is your favourite?'))
    if question == 1:
        print('Nice!')
    elif question == 2:
        print('Cool')
    elif question == 3:
        print('Awesome!')
    else:
        print('That\'s not an option!')# answered after 7 years

答案 7 :(得分:-1)

我为这种情况制作了一个名为 restricted_input 的模块,它实时检查输入。在这里,因为您只需要 1-3 的输入,所以这样做

from restricted_input import r_input
num = int(r_input("Out of these options\(1,2,3), which is your favourite? ", input_type="nothing", allow="123", maxlength=1))

它使用 msvcrt.getch/termios 来获取非阻塞输入,因此它实时检查并只允许指定字符。
注意:这在 Spyder、Jupyter 等 IDLE 中不起作用。