1
Another_Mark = raw_input("would you like to enter another mark? (y/n)")

while Another_Mark.lower() != "n" or Another_Mark.lower() != "y":
    Another_Mark = raw_input("Do you want to input another mark? Please put either 'y' or 'n' this time")

if Another_Mark == "y":
    print "blah"

if Another_Mark == "n":
    print "Blue"

这不是我使用的实际代码,除了第一三行。无论如何,我的问题是为什么当我输入值'y'或'n'时,while循环会继续重复,当它再次询问你是否想在第三行输入另一个标记时。我陷入了无限重复的循环。当 Another_Mark 的值更改为“y”或“n”时,不应重复

4

4 回答 4

5

尝试:

while Another_Mark.lower() not in 'yn':
    Another_Mark = raw_input("Do you want to input another mark? Please put either 'y' or 'n' this time")

not in如果在给定的可迭代对象中找不到给定的对象,则运算符返回 true,否则返回 false。所以这就是您正在寻找的解决方案:)


由于布尔代数错误,这根本不起作用。正如 Lattyware 所写:

not(a 或 b)(您所描述的)与 not a 或 not b(您的代码所说的)不同

>>> for a, b in itertools.product([True, False], repeat=2):
...     print(a, b, not (a or b), not a or not b, sep="\t")
... 
True    True    False   False
True    False   False   True
False   True    False   True
False   False   True    True
于 2013-04-14T18:11:31.443 回答
3

你的循环逻辑只有每一个都是真的——如果输入是“n”,那么它不是“y”,所以它是真的。相反,如果它是“y”,则不是“n”。

尝试这个:

while not (Another_Mark.lower() == "n" or Another_Mark.lower() == "y"):
    Another_Mark = raw_input("Do you want to input another mark? Please put either 'y' or 'n' this time")
于 2013-04-14T18:12:05.233 回答
1

您循环背后的逻辑是错误的。这应该有效:

while Another_Mark.lower() != "n" and Another_Mark.lower() != "y":
    Another_Mark = raw_input("Do you want to input another mark? Please put either 'y' or 'n' this time")
于 2013-04-14T18:14:25.197 回答
1

您需要使用 AND 而不是 OR。

这是布尔逻辑分布的方式。你可以说:

NOT ("yes" OR "no")

或者您可以通过将 OR 翻转为 AND 将 NOT 分配到括号中(这是您想要做的):

(NOT "yes") AND (NOT "no")
于 2013-04-14T18:16:14.970 回答