我正在努力学习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."
这对我来说似乎有点多余。第一个脚本出了什么问题?
答案 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']:
...