2012-03-21 102 views
0
22 and 333/12 or 1 

我遇到了上面的代碼行。結果是27,但我不太明白andor在這種情況下的含義。有人可以向我解釋,首選的例子。提前致謝!!'和'和'or'在Python中如何處理非布爾值?

+0

請注意,如果您希望在條件爲True時產生一個False值 - 22和None或1將使'1'不是'None',此技巧不起作用。 '(None,1)[22]'確實有效,只要可以評估真值和假值,因爲它不會短路。 – agf 2012-03-21 02:16:52

+1

下面的答案很好,但是如果你找到寫這行代碼的人,你應該給他們一記耳光 – wim 2012-03-21 02:18:25

回答

8

這是"and-or trick" - andor實際上並不返回布爾值;相反,他們返回其中一個輸入參數。人們曾經使用它來控制流量。

從python 2.5開始,由於引入了條件表達式,所以不再需要它了。

22 and 333/12 or 1 

相當於

333/12 if 22 else 1 
+0

+1爲什麼這個工程的原因。 – Blender 2012-03-21 01:46:25

+5

「if else」更具可讀性。我希望人們不會訴諸於和/或欺騙。 – Anorov 2012-03-21 01:51:31

+0

我認爲內聯的'if ... else ...'沒有在老的Python版本中實現,所以支持它們的腳本可能仍然會使用它。 – Blender 2012-03-21 01:53:33

5

A and B返回如果A是假的,或B,否則:

>>> 0 and 1 
0 
>>> False and True 
False 
>>> True and 'yes' 
'yes' 
>>> True and '' 
'' 

同樣, 'A或B' 返回如果A是真實的,或B,否則:

>>> 0 or 1 
1 
>>> False or True 
True 
>>> '' or 'yes' 
'yes' 
>>> False or '' 
'' 
>>> 'yes' or '' 
'yes' 
+0

而且由於'和'在Python中的優先級高於'或',所以'22和333/27'被評估爲比'333/12或'。 '0和333/27或1'會返回'1'。 – 2012-03-21 01:44:20

0

讓我們分開出:

22 and 333/12 or 1 
(22 and 333/12) or (1) # Parentheses are nice 
(22 and 27) or (1)  # 333/12 = 27 because you are using integers for division 
22 and 27    # 22 and 27 is True, as neither of them is False 
27      # Not sure why anything is returned, but the second 
         # value always returned if it is True 
0

邏輯操作數和,或將在這個特殊的sc根據優先規則進行安排。

首先它會計算333/12,它是27,然後它將變成22和27或1,這相當於27,並且或者具有相同的優先級。

22 and 333/12 or 1 
22 and 27 or 1 
(22 and 27) or 1 OR 22 and (27 or 1) 

27 ,27 

但在Python 3.2的情況下,它計算到27.75。

>>> 22 and 333/12 or 1 
27.75 
>>> (22 and 333/12) or 1 
27.75 
>>> 22 and (333/12 or 1) 
27.75 
+0

在'或'之前評估'和',查看其他答案。 – agf 2012-03-21 02:18:24

1

在Python,非零數被計數爲真布爾表達式的目的,並且零計爲假。所以即使andor通常與布爾型號TrueFalse一起使用,它們也可以用於數字。

問題是:像10 and 3這樣的表達式的值是什麼值,其中兩個值的計算結果都是true?在C中,它具有類似的整型布爾語義,10 && 3的值爲1,這是最常用的真值。但是,在Python中,這個表達式的值是3,和表達式的後半部分。這是有道理的,因爲和短路,這意味着0 and 3是0,所以and有「如果它是假的第一個值,否則第二個」的語義。

你發佈的表達如何?通過運算符優先級,這是一樣的

(22 and 333/12) or 1 

22 and 333/12值是333/12,這是27.自或運營商短路,Python解釋器評估27 or 1時需要第一個真正的價值,並得到27。