在这种情况下,为什么“和”而不是“或”起作用?

时间:2019-08-20 03:23:50

标签: python

在这种情况下,如果未输入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,它都会卡在输入循环中。虽然版本可以正常工作。

4 个答案:

答案 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)

在代码中,如果用户输入xy,则希望跳出循环。您可以将条件(当您想退出时)写为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==组合成!=。但是,如果没有它,它也可以工作。这三个循环都可以为您工作:

  1. while not (var == 'x' or var == 'y'):
  2. while not var == 'x' and not var == 'y':
  3. while var != 'x' and var != 'y':

选择对您来说最具表现力的一个。我可能更喜欢第三个。或者,我将条件重写为var not in ['x', 'y'],以避免直接重复var ==