2012-05-06 117 views
7

我很困惑Python如何評估布爾語句。布爾操作

例如,

False and 2 or 3 

回報3

這是如何評估的?我認爲Python首先看着'False和2',並且甚至沒有看''或'3'就返回False。 Python在這裏看到的順序是什麼?

另一個原因是:

1 or False and 2 or 2 and 0 or 0 

返回1

從我從第一個例子中聚集,我想的Python將評估由左到右,所以「1或假」將返回1,那麼「1和2」將返回2,則「2或2」將返回第一2,則「2和0」將返回0,則「0或0」將返回第二0

,你可以告訴我在這裏很困惑,請幫助!

謝謝!

回答

9

and優先於or

False and 2 or 3 

作爲

((False and 2) or 3) 

被評估由於第一部分(False and 2)False,Python有到評估的第二部分,以看到整個條件是否仍可成爲True與否。它可以,因爲3的計算結果爲True,所以返回該操作數。

1 or False and 2 or 2 and 0 or 0類似的被作爲

(1 or ((False and 2) or ((2 and 0) or 0))) 

由於1評估爲評估True,整個條件將True,不管哪個值的其它操作數具有。Python可以在這一點停止評估,並返回確定最終值的操作數。

早作爲最終結果,確定被稱爲short-circuit evaluation並且可以被描述如下停止:

每當表達的最終結果被確定,評估被停止,並且在Python的操作數的值,該值確定返回的最終值。也就是說,假設左到右的評價:

  • and操作,計算結果爲False最左邊的操作數(或最後一個)
  • or運營商,最左邊的操作數計算結果爲True(或最後一個)
+0

啊所以任何比較,都應該被括在自己的括號內。這樣做更有意義。你怎麼知道要做的(1或((((False和2)或(2和0))或0))而不是(1或(False和2)或(2和0)或0)? – kkSlider

+1

@kkSlider只有在需要改變優先順序時,或者想要使其更清晰 - 就像在正常的數學中一樣。過度的包圍會使你的代碼不太清晰。至於你的例子。這是你的情況的邏輯是什麼。 –

+0

@kkSlider:如果您不想執行特定的訂單,則不一定非要這樣做。但是,如果您想要將表達式評估爲「False和(2或3)」,那就必須這樣做。 *編輯:*什麼@Lattyware說:) –

3

這裏的問題是,有一個命令來評估,並and has a higher precedence than or。因此,它們在這裏從左到右進行評估。

鑑於此,False and 2 or 3是python (False and 2) or 3 - 因此它評估爲False or True,然後評估爲True

在你的下一個例子中,Python短路,所以1 or False評估爲True1,因此返回1。其餘的永遠不會被評估。這是有道理的,就好像or的一部分是True一樣,你知道整個事情一定是 - 所以爲什麼要做額外的工作呢?

一個很好的方法來檢查,這是定義打印功能:

>>> def test(x): 
...  print("Test: "+str(x)) 
...  return x 
... 
>>> test(1) or test(0) or test(3) 
Test: 1 
1 
>>> test(0) or test(0) or test(3) 
Test: 0 
Test: 0 
Test: 3 
3 
>>> test(False) and test(2) or test(3) 
Test: False 
Test: 3 
3 
>>> test(1) or test(False) and test(2) or test(2) and test(0) or test(0) 
Test: 1 
1 

這可以很容易地看到什麼被評價,以及以什麼順序。

2

我讀到這個Python文檔頁面上,而回你的聲明進行評估。如果我找到它,我會發布參考。 它在布爾語句中聲明瞭一些東西,Python將返回第一個True對象。因此......並且被False預先抨擊,但是或者只有一個論點,即3(真)。

+0

我有一些不好打字在這裏,但是,正如其他人所說,第一步是布爾優先順序,第二步是,Python不會只返回一個True或對於陳述而言是虛假的,但實際值(可能是真或假)。 – jheld

2

據評估這樣的:

result = (False and 2) or 3 

所以基本上如果False and 2是真的十歲上下,則返回,否則3返回。