22 and 333/12 or 1
我遇到了上面的代碼行。結果是27,但我不太明白and
和or
在這種情況下的含義。有人可以向我解釋,首選的例子。提前致謝!!'和'和'or'在Python中如何處理非布爾值?
22 and 333/12 or 1
我遇到了上面的代碼行。結果是27,但我不太明白and
和or
在這種情況下的含義。有人可以向我解釋,首選的例子。提前致謝!!'和'和'or'在Python中如何處理非布爾值?
這是"and-or trick" - and
和or
實際上並不返回布爾值;相反,他們返回其中一個輸入參數。人們曾經使用它來控制流量。
從python 2.5開始,由於引入了條件表達式,所以不再需要它了。
22 and 333/12 or 1
相當於
333/12 if 22 else 1
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'
而且由於'和'在Python中的優先級高於'或',所以'22和333/27'被評估爲比'333/12或'。 '0和333/27或1'會返回'1'。 – 2012-03-21 01:44:20
讓我們分開出:
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
邏輯操作數和,或將在這個特殊的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
在'或'之前評估'和',查看其他答案。 – agf 2012-03-21 02:18:24
在Python,非零數被計數爲真布爾表達式的目的,並且零計爲假。所以即使and
和or
通常與布爾型號True
和False
一起使用,它們也可以用於數字。
問題是:像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。
請注意,如果您希望在條件爲True時產生一個False值 - 22和None或1將使'1'不是'None',此技巧不起作用。 '(None,1)[22]'確實有效,只要可以評估真值和假值,因爲它不會短路。 – agf 2012-03-21 02:16:52
下面的答案很好,但是如果你找到寫這行代碼的人,你應該給他們一記耳光 – wim 2012-03-21 02:18:25