19

这是我的一段代码:

choice = ""

while choice != "1" and choice != "2" and choice != "3": 
    choice = raw_input("pick 1, 2 or 3")

    if choice == "1":
        print "1 it is!"

    elif choice == "2":
        print "2 it is!"

    elif choice == "3":
        print "3 it is!"

    else:
        print "You should choose 1, 2 or 3"

虽然它有效,但我觉得它真的很笨拙,特别是 while 子句。如果我有更多可接受的选择怎么办?有没有更好的方法来制定条款?

4

7 回答 7

50

while通过检查元素是否在这样的选择列表中,可以稍微重构该位以使其更清洁

while choice not in [1, 2, 3]:

这是检查选择的值是否不是该列表中的元素

于 2012-09-23T15:34:16.740 回答
5

您可以将逻辑推入循环,并替换

while choice != "1" and choice != "2" and choice != "3": 

while True:

然后初始行choice = ""是不必要的。然后,在每个分支中,一旦你完成了你想做的事情,你就可以break

于 2012-09-23T15:33:01.730 回答
4

我认为这样的事情会更好

possilities = {"1":"1 it is!", "2":"2 it is!", "3":"3 it is!"} 
choice = ""

while True:
    choice = raw_input("pick 1, 2 or 3")
    if choice in possilities:
        print possilities[choice]
        break
    else:
        print "You should use 1, 2 or 3"
于 2012-09-23T15:44:12.423 回答
1

您可以使用字典将 1 映射到当 1 是值时要执行的代码,依此类推...这样您就可以摆脱 ifs 并且您的代码将来可以通过简单地更新字典来支持其他值. 至于 while 中的条件,您只需检查键是否在字典中。

于 2012-09-23T15:36:26.407 回答
1

我建议有一个函数,它只循环直到选择了一个有效的选项,然后返回选择的值。

这意味着您的其余代码不打算在 内部while,保持一切都很好和平坦(“平坦比嵌套更好”

def get_choice(options):
    """Given a list of options, makes the user select one.

    The options must be strings, or they will never match (because raw_input returns a string)

    >>> yn_choices = ['y', 'n']
    >>> a = get_choice(options = yn_choices)
    """
    prompt_string = "Pick " + ", ".join(options)
    while True:
        choice = raw_input(prompt_string)
        if choice in options:
            return choice
        else:
            print "Invalid choice"

# Prompt user for selection
choice = get_choice(["1", "2", "3"])

# Do stuff with choice...
if choice == "1":
    print "1 it is!"

elif choice == "2":
    print "2 it is!"

elif choice == "3":
    print "3 it is!"

else:
    print "You should choose 1, 2 or 3"
于 2012-09-23T15:49:20.030 回答
0

我认为您可以使用包含所有可能选择的集合,并使用“in”表达式来判断 while 部分。

至于 if-else 部分, print (choice, " it is!") 就可以了。

于 2012-09-23T15:35:33.673 回答
-1

while str(choice) not in "123" ......

于 2012-09-23T15:34:38.053 回答