“或”似乎在Python中不起作用

时间:2013-03-05 17:29:49

标签: python

我正在努力学习Python,我偶然发现了这个令人难以置信的奇怪的异常,同时为我自己的学习目的编写了一个“测验”。布尔“或”函数表现得有些奇怪。这是代码的一部分:

def answercheck(answer):
    solved = 0
    while solved == 0:
        useranswer = raw_input("> ")
        if useranswer == answer:
            solved = 1
            correct()
        elif useranswer == "A" or "B" or "C" or "D":
            solved = 1
            incorrect()
        else:
            print "False input. Try again."

这是发生了什么。在为测验竞赛者打印测验问题后,以真实答案作为参数调用answercheck函数。然后提示用户提供答案。因为我希望唯一有效的答案是“A”,“B”,“C”或“D”,所以我把这个东西放在“while”循环中。

所以,我怀疑,如果有人通过raw_input使'useranswer'像'lol'一样无用,它会再次提示用户,直到插入“A”,“B”,“C”或“D”作为答案。但是,它并没有采取任何“回答”不正确的答案。

所以我稍微重写了一下,当我这样做时它似乎有效:

def answercheck(answer):
    solved = 0
    while solved == 0:
        useranswer = raw_input("> ")
        if useranswer == answer:
            solved = 1
            correct()
        elif useranswer == "A":
            solved = 1
            incorrect()
        elif useranswer == "B":
            solved = 1
            incorrect()
        elif useranswer == "C":
            solved = 1
            incorrect()
        elif useranswer == "D":
            solved = 1
            incorrect()
        else:
            print "False input. Try again."

这对我来说似乎有点多余。第一个脚本出了什么问题?

4 个答案:

答案 0 :(得分:4)

{em> useranswer的正确语法是"A""B""C""D" 中的任何一个:

elif useranswer in ("A", "B", "C", "D"):

或(如果你的Python版本足够支持set literals):

elif useranswer in {"A", "B", "C", "D"}:

你现在拥有的是语法上有效的,但具有完全不同的含义。

答案 1 :(得分:3)

or对两个布尔变量进行操作;它不会创建一组替代选择。试试这个:

useranswer == "A" or useranswer == "B" or useranswer == "C" or useranswer == "D"

或者,更方便:

useranswer in ("A", "B", "C", "D")

甚至

useranswer in "ABCD"

答案 2 :(得分:1)

useranswer == "A" or "B" or "C" or "D"表示

(((useranswer == "A") or "B") or "C") or "D"

这就是为什么它不能按你喜欢的方式工作

答案 3 :(得分:1)

运算符优先级 - 它评估useranswer == 'A'为什么,然后“B”,“C”,“D”总是评估为“True”

你需要做这样的事情“

if useranswer in ['A', 'B', 'C', 'D']:
    ...