2017-07-18 67 views
1

我试图理解为什么我从以下if得到不合理的结果:蟒蛇条件语句unreasonble结果

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): 

,它是确定,但我想明白为什么上面不起作用。

回答

0

这是因为条件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中有很好的解释。

1

括号作为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

1

由于运算符的优先级,您需要将两个条件置于括号中以获得预期的结果。否则,比较运算符就解决了,在你的代码中检查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

0

this,你可以把更多国际海事组织可读:

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"