验证用户选项-Python

验证用户选项-Python,python,python-3.x,Python,Python 3.x,我似乎做不到这一点。我有一个大程序,需要稍微修改一下 我需要做的就是确保用户在输入有效选项之前无法继续。“1”、“2”、“3”和“4”以外的任何内容均无效 def GetResponse(): global Response Response = (input("Enter Option number: ")) 如果这是代码,则输入任何内容时,菜单将继续显示。什么也没发生,只是菜单继续出现。(字符串或任何数字),但如果我稍微修改它并仅使响应为整数: def GetRespons

我似乎做不到这一点。我有一个大程序,需要稍微修改一下

我需要做的就是确保用户在输入有效选项之前无法继续。“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,我不会得到错误,但同时程序不会响应有效的输入

对不起,如果这是不清楚的信息。这是我能解释的最好的方式。
实际响应在Python中是不同类型的整数和字符/字符串。例如,
'1'
1
不同

如果您的菜单选项看起来像:

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

如果在Python2.x中为1,
input
对输入的文本求值
int
如果向其传递无法转换为整数的内容,则会引发ValueError

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

使用原始输入可能更有意义,因为您不太可能希望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")
抄袭他人的行为:

在Python2.7中,
input()
不是获取用户输入所需的。实际上,您需要
原始输入()
。(这确实是令人困惑的,在Python3中已经修复了。)

不同之处在于,
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?!

你的缩进是错的。此外,我们通常对变量和函数使用
lower_case
,对类保留
CamelCase
。此外,最好返回一个响应,而不是修改一个全局变量。详细说明@Katrielex的建议:全局变量是不好的-它们鼓励一种编码风格,允许程序的任何部分修改程序其他部分使用的值。当代码的一部分在您没有预料到的情况下更改了某个值,而整个程序在您面前崩溃时,就会出现问题。我已经修复了缩进,因此代码将通过语法检查。我使用Python 3。这不使用原始输入,是吗?是的。您可以将
输入
替换为
原始输入
。大多数人使用Python2.X。如果您需要有关python 3.X的帮助,请提供相应的标记。@JoeTaylor:Ah-Py3k。解释了很多。正如您所知,除非您说您正在使用Python3,否则我们通常会假设您正在使用Python2(这是非常不同的),并给出适用于Python2的建议。对于像这样的问题,区别是非常显著的,所以请始终告诉我们您是否在使用Python3。@JoeTaylor:如果您在学习Python,您将发现Python2比Python3有更多的资源。你不应该仅仅因为Python3是最新版本就使用它。仍然有很多Python库不能与Python3一起使用。Python的创建者做了一些更改,故意破坏了向后兼容性。或float,或Python支持的任何其他数值类型。一个有趣的错误是,如果用户输入“1”或“5”,并正确地拒绝输入(如“bacon三明治”),代码工作正常,但在用户输入(如“1.5”)时会出现问题。
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)