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):
没关系,但我想了解为什么上面的方法不起作用。
,您需要括号
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"
我试图理解为什么我从以下 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):
没关系,但我想了解为什么上面的方法不起作用。
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"