python 条件语句不合理的结果

python conditional statement unreasonble results

我试图理解为什么我从以下 if 得到不合理的结果:

def print_if_neg (a,b):   
    if a < 0 != b < 0:
        print "Only One Neg"
    else:
        print "0 or 2"

print_if_neg(1,1)
print_if_neg(-1,1)
print_if_neg (1,-1)
print_if_neg(-1,-1)

我得到 3 次 0 or 2 然后是最后一次 Only One Neg
这个复杂条件的顺序是什么?

我试过这个:

if (a < 0) != (b < 0):

没关系,但我想了解为什么上面的方法不起作用。

由于 operator precedence

,您需要括号
def print_if_neg (a,b):   
    if (a < 0) != (b < 0):
        print "Only One Neg"
    else:
        print "0 or 2"

正如 CoryKramer 所指出的,运算符优先级正在发挥作用。

您的代码等同于:

def print_if_neg (a,b):   
    if a < (0 != b) < 0:
        print "Only One Neg"
    else:
        print "0 or 2"

因为根据语言定义,!= 的优先级高于 <

因此,使用 () 强制您需要的优先级:

def print_if_neg (a,b):   
    if (a < 0) != (b < 0):
        print "Only One Neg"
    else:
        print "0 or 2"

此外,仅供参考,您正在编写 xor operator

由于运算符的优先级,您需要将两个条件放在括号中以获得预期结果。否则比较运算符将被解决,检查代码中的 0 != b,这不是您期望的。

def print_if_neg (a,b):
    if (a < 0) != (b < 0):
        print ("Only One Neg")
    else:
        print ("0 or 2")

print_if_neg(1,1)
print_if_neg(-1,1)
print_if_neg (1,-1)
print_if_neg(-1,-1)

请注意,所有比较运算符都具有相同的优先级并且比较可以任意链接,例如,x < y <= z 等同于 x < y AND y <= z

这是因为条件 a < 0 != b < 0 表示 a < 0 AND 0 != b AND b < 0 首先,当 a >= 0 第一个条件的计算结果为 False 时,没有别的得到评估。然后,如果 a <0 但 b=1,则链中的最后一个条件为 False。因此,您的链接条件在 4 次中有 3 次是假的。

这在 Python 文档的 section 6.10 中有很好的解释。

this 开始,您可以使其更具可读性 imo:

from operator import xor
def print_if_neg (a, b):   
    if xor(a < 0, b < 0):
        print "Only One Neg"
    else:
        print "0 or 2"