验证用户选项 - Python

时间:2012-04-01 16:28:33

标签: python python-3.x

我似乎无法做到这一点。我有一个需要稍微修改的大程序。

我需要做的就是确保在输入有效选项之前用户无法继续操作。除“1”,“2”,“3”和“4”以外的任何内容均无效。

def GetResponse():
    global Response
    Response = (input("Enter Option number: "))

如果这是代码,则菜单会在输入任何内容时继续显示。没有什么事情发生,除了菜单继续出现。 (字符串或任何数字),但如果我稍微修改它并仅使响应为整数:

def GetResponse():
    global Response
    Response = (int(input("Enter Option number: ")))

然后在这里,如果输入了一个有效的选项,它将带您进入该选项,而如果我输入一段文本,则会出现错误(预计我知道)

我感到困惑的是为什么,当我改变为int时,它才会响应输入的选项,而如果我取消int,我没有错误,但同时程序没有回应有效的投入。

对不起,如果这是不清楚的信息。这是我解释它的最佳方式。 实际回复

3 个答案:

答案 0 :(得分:2)

在Python 2.x中,input评估输入的文本。 int如果你传递一个无法转换为整数的东西,就会引发一个ValueError。

因此它与数字一起工作的原因是数字会计算数字 - 就像它们在Python命令行中一样。我敢打赌,如果你将print "hello world"放入你的示例中,就不会像输入zzzz那样得到同样的错误。第一个是有效的Python,第二个不是。

使用raw_input可能更有意义,因为您不太可能希望Python解释器解释输入的文本 - 如果用户输入import sys; sys.exit()会怎么样?

我认为在这里做的正确的事情是接受输入,尝试将其转换为int,并在它抛出错误时重新提示。

choice = None
while not choice:
    val = raw_input("Enter Option Number: ")
    try:
        choice = int(val)
    except ValueError:
        print("Must be an integer 1 to 4")

答案 1 :(得分:0)

整数和字符/字符串在Python中是不同的类型。例如,'1'1不同。

如果您的菜单选项如下所示:

if 1 <= input <= 4:
    # Valid input, find the menu

...然后你要检查整数。

希望这是有道理的。

答案 2 :(得分:0)

从另一个answer of mine抄袭:

在Python 2.7中,input()不是您想要获取用户输入的内容。你真的想要raw_input()。 (这确实是令人困惑的,并已在Python 3中得到修复。)

不同之处在于input()接受用户输入,然后尝试对其进行评估,就好像您将其作为命令键入交互式Python会话一样。评估函数调用和表达式,这导致一些“什么?!”如果您尝试将其用于通用用户输入,请注意以下几点:

In [18]: my_number = input("Please enter a number >> ")
Please enter a number >> locals() # unexpected user input

In [19]: print (my_number)
{'disp': <function disp at 0x029FBEB0>, 'all': <function all at 0x0290BA70>,
 'dist': <function dist at 0x030D1430>, 'issubsctype': <function issubsctype
 at 0x028FADF0>, 'sca': <function sca at 0x062AF370>, 'savez': <function
 savez at 0x02A8E830>, 'entropy': <function entropy at 0x030C8F70>,
 'restoredot': <built-in function restoredot>, 'ptp': <function ptp at
 0x0290BB30>, 'Subplot': <class 'matplotlib.axes.AxesSubplot'>, 'frange':
 <function frange at 0x030D1930>, 'PackageLoader': <class
 numpy._import_tools.PackageLoader at 0x0248C8B8>, 'rec2csv':
 <function rec2csv at 0x030FE4B0>, 'ylabel': <function ylabel at 0x062AF6F0>, ....
# what?!

相反,使用raw_input()向用户询问输入,然后返回他们输入的任何字符串。

阅读input()raw_input()的文档可能有助于澄清这一点。


啊,你正在使用Python 3.在这种情况下,试试approach I suggested in the other question - 定义一个永远循环的函数,直到它获得有效的用户输入,然后返回(从而打破循环。)

Python 2.x代码获取浮点数:适应Python 3并获取整数。 (这对你来说是一项微不足道的练习。)

def get_float_from_user (prompt):
    while True:
        try:
            user_input = float(raw_input(prompt))
            return user_input
        except ValueError:
            print ("Not a floating point number. Please try again.")

x = get_float_from_user("Enter x.")
y = get_float_from_user("Enter y.")

print (x+y)