【问题标题】:Python 3: Creating A Function For User ChoicePython 3:为用户选择创建函数
【发布时间】:2012-03-15 16:37:36
【问题描述】:

我正在尝试在 Python 3 中创建一段代码,允许用户在多个选项之间进行选择。我已经尝试了几种方法,但似乎没有一个是正确的方法。

示例尝试:

usr_input = input("Input: ")
while (usr_input != '1') | (usr_input != '2'):
    if usr_input == '1':
        search()
    elif usr_input == '2':
        sys.exit()

这样做的问题是脚本在输入错误的命令后挂起。

谁能给我正确的方法?

【问题讨论】:

  • 您认为| 运算符的作用是什么?你有没有在>>>提示下试过看看?请尝试然后发布您对表达式 (usr_input != '1') | (usr_input != '2') 应该如何工作的解释。解释你背后的原因很重要。

标签: python if-statement python-3.x while-loop


【解决方案1】:

这里有一些问题。

首先,您只能在循环之外获得一次usr_input。如果这不是一个正确的选择,您不会给用户更改以更正他们的选择:您只需循环。您需要在循环中执行input

其次,您的布尔条件是错误的。这相当于说“x 不是 a OR 不是 b”,这总是正确,因为即使它是 a,它仍然不是 b。更好的说法是not in ['1', '2']

把这些放在一起:

usr_input = ''
while usr_input not in ['1', '2']:
    usr_input = input("Input: ")
    ... etc... 

【讨论】:

  • 我也更喜欢not in list 模式。
  • 有理由使用not in list 方法而不是@orangeoctopus 建议的方法还是只是个人喜好?
  • 这很好,因为您不必多次键入 usr_input 并且可以扩展到更多选项,例如 ['1', '2', '3', '4']。我只是觉得它更简洁。
【解决方案2】:

当用户没有正确输入某些内容时,您想使用 while 循环继续请求输入。在你的 while 循环中,usr_input 永远不会改变,所以它一直在循环。

你还有另一个问题:只有当 usr_input 不是 1 并且不是 2 时,你才应该继续循环。不是 1 或不是 2 总是正确的(如果它是 2,它不是 1,如果它是 1,它是不是 2)。

usr_input = input("Input: ")
while (usr_input != '1') and (usr_input != '2'):
    usr_input = input("Input: ")

if usr_input == '1':
    search()
elif usr_input == '2':
    sys.exit()

【讨论】:

  • 您第一次要求输入时实际上并没有在这里做任何事情,所以不应该把它排除在外并用usr_input = 0 替换,这样while 循环就不会引用这样的东西还没有价值?
  • (usr_input != '1') 或 (usr_input != '2') 总是正确的,应该是 'and'
  • 如果你先输入“1”,它永远不会进入while循环。感谢您抓住 Adrian,已修复。
  • 哦,我明白了!乍一看,我认为 if 语句在 while 循环中。谢谢!
【解决方案3】:

input() 相当于eval(raw_input()),所以如果你的用户输入了一些语法错误的东西,它会抛出一个 SyntaxError 异常。查看文档:http://docs.python.org/library/functions.html#input

您可以通过捕获 SyntaxError 并对其进行处理来改进您的代码,因此它不会使您的程序崩溃。

【讨论】:

  • 这是 Python 3,但事实并非如此。
  • @DanielRoseman 我承认我的经验是 Python 3 之前的版本——哪一点不正确? eval() 的行为或捕获异常?
  • @KarlBarker in 3.x input 只读取字符串并去除换行符。没有eval() 完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多