2014-02-08 51 views
0

我在问用户他们是否想先走,并使用输入验证,以便只接受“y”“Y”“n”或“N”作为有效响应。我的代码似乎崩溃时,我运行它。Python:输入验证

choice = raw_input("Would you like to go first or not? (y/Y or n/N): ") 
print "" 

try: 
    valid_choice = False 
    while not valid_choice: 
     if choice == "y" or choice == "Y": 
      users_turn = True 
      valid_choice = True 
     elif choice == "n" or choice == "N": 
      users_turn = False 
      valid_choice = True 
      break 
    else: 
      print "Invalid Choice." 

except NameError: 
    print "You can only enter y/Y or n/N" 
+0

*“我的代码似乎崩溃了”* - 以何种方式,更准确地说?什么是错误? – Dolda2000

+0

您在if子句 – zhangxaochen

+0

中缺少'break'如果这些答案中的任何一个对您有帮助,您应该选择一个作为解决方案。 –

回答

2

啊,你的代码中的流程有太多可能的路径。你可能喜欢的东西把它简化:

question = "Would you like to go first or not? (y/Y or n/N): " 
choice = raw_input(question) 
while choice not in ['y', 'Y', 'n', 'N']: 
    print 'Invalid choice' 
    choice = raw_input(question) 
users_turn = choice in ['y', 'Y'] 

说了这么多,我应该说这是一个控制台应用程序使用(Y/n)以表明它接受字母yn作为响应的通用模式(在大写和小写),但大写字母表示默认选项。

所以,如果你可以信任用户做出决定你第一次要求输入的问题,您可以设置这样的默认响应和代码是:

choice = raw_input('Would you like to go first? (Y/n)') 
users_turn = choice.lower() not in ['n', 'no'] 
+0

@zhangxaochen我看到你的编辑使用了一个字符串,但我认为我仍然更喜欢使用一个列表 - 这样你就可以添加其他可能的答案,比如'yes','no''和首字母以支持其他语言。 – elias

+0

是的,我删除了该编辑,因为'ynnN''中的'Yn'给出了'True'。对不起; P – zhangxaochen

+0

@ zhangxaochen哦是的,还有那个! =) – elias

0

,正如替代Elias的答案,我想提出以下几点:

while True: 
    choice = raw_input("Would you like to go first or not? (y/Y or n/N): ") 
    if choice in ["y", "Y", "n", "N"]: 
     break 
    print "Invalid choice" 
users_turn = choice in ["y", "Y"] 

这是在更好地不重复问线,但在糟糕的while True/break语法是有点难看(它如果Python有do会很好...像C一样的while,但唉)。选择你最喜欢的自己。 :)

而且,只是指出一些你有几个错误的在自己的代码:

  • try ... except NameError块完全是多余的,因为没有在你的代码将抛出NameError,并且特别不用于指示实际的用户错误。
  • 你有你的else行在错误的缩进。就目前而言,它与while区块相匹配,而不是if/elif区块,导致您最不可能打算的行为。
  • elif块中的break块是多余的,因为当您将valid_choice设置为True时,while环路将退出。
  • 最重要的是所有的,当你输入一个无效的答案时,你不会重新分配用户,导致你的代码永远循环。也许这是你所说的未说明的崩溃?
0
def get_one_of(prompt, options, default=None): 
    options = set(options) 
    while True: 
     val = raw_input(prompt) 
     if val == '' and default is not None: 
      return default 
     elif val in options: 
      return val 

response = get_one_of('Do you want to go first? [Yn] ', 'yYnN', 'y') 
users_turn = response in 'yY'