2017-07-18 81 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"