在这种情况下,如果未输入x或y,则将重新运行以进行正确的输入。为什么在这种情况下“和”而不是“或”起作用?
while var != 'x' and var != 'y':
var = input("x or y ")
上面的代码按预期的功能运行,而下面的代码则没有。
while var != 'x' or var != 'y':
var = input("x or y ")
有人可以解释吗?如果我正确理解这一点,则如果var没有收到x 或 y的输入,则将重新运行它。经过测试,无论我输入的是x还是y,它都会卡在输入循环中。虽然和版本可以正常工作。
答案 0 :(得分:3)
使用or
总是正确的,因为您只输入一个字母。因此,如果两个条件之一为假,另一个条件为真,那么无论您输入哪个字母,您都将陷入无限循环。
答案 1 :(得分:3)
请注意,以下内容是等效的:
var != 'x' or var != 'y'
not (var == 'x' and var == 'y')
在第二种形式中,它总是计算为True
可能更容易。
答案 2 :(得分:2)
var != 'x' and var != 'y'
, var not in ['x','y']
应该为 true
(或只要var既不是x也不是y)。
var != 'x' or var !='y'
是 true ,仅当var不是x
或var不是y
...时,因为该语句不能同时是x和y 总是为真
除了类似以下情况的愚蠢行为
class Test:
def __ne__(self,other):
return False
这是一个真值表,可以进一步帮助解释为什么它总是真
cond1 = var !='x' # T if var is anything but x, F if var is x
cond2 = var != 'y' # T if var is anything but y, F if var is y
| cond1 | cond2 | cond1 ^ cond2 | value of var
+-------+-------+---------------+-------------
| T | F | T | y
| F | T | T | x
| T | T | T | a
| F | F | F | var = x && var = Y => IMPOSSIBLE
答案 3 :(得分:0)
在代码中,如果用户输入x
或y
,则希望跳出循环。您可以将条件(当您想退出时)写为var == 'x' or var == 'y'
。但是,您正在测试while循环中的值,如果条件为true,它将继续循环。如果条件为假,则停止循环。因此,您需要取消条件。您可以使用not (var == 'x' or var == 'y')
。
工作代码中的版本只是检查同一件事的一种更简洁的方法。通过DeMorgan's laws,析取的否定(or
表达式)是否定的结合(and
表达式内有否定词)。一种具有象征意义的书写方式是:not (A or B) = not A and not B
在Python代码中,我们可以采取额外的步骤将not
和==
组合成!=
。但是,如果没有它,它也可以工作。这三个循环都可以为您工作:
while not (var == 'x' or var == 'y'):
while not var == 'x' and not var == 'y':
while var != 'x' and var != 'y':
选择对您来说最具表现力的一个。我可能更喜欢第三个。或者,我将条件重写为var not in ['x', 'y']
,以避免直接重复var ==
。