2

我正在尝试学习 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

4 回答 4

4

的正确语法useranswer"A"、或"B""C""D"的任何一个:

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

或(如果您的 Python 版本足够新以支持集合文字):

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

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

于 2013-03-05T17:30:55.697 回答
3

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

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

或者,更方便:

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

甚至

useranswer in "ABCD"
于 2013-03-05T17:32:16.847 回答
1

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

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

这就是为什么它不能像你喜欢的那样工作

于 2013-03-05T17:31:09.140 回答
1

运算符优先级 - 它评估useranswer == 'A'为任何值,然后 "B"、"C"、"D" 始终评估为 "True"

你需要做这样的事情”

if useranswer in ['A', 'B', 'C', 'D']:
    ...
于 2013-03-05T17:32:58.893 回答