2012-05-24 31 views
5

我停留在該特定示例中從深入Python深入Python和或失敗

實施例4.18。當與或圈套失敗

>>>>a = "" 
>>>>b = "second" 
>>>1 and a or b 
>>>>'second' 

由於是空字符串,它的Python認爲虛假在布爾上下文,1和「」演算值爲「」,和 然後「」或「第二」評估爲'第二'。哎呀!這不是你想要的。 和 - 或技巧,bool和a或b,不會像C表達式bool一樣工作嗎? a:b當a在 布爾上下文中爲假時。

它爲什麼說它不是用戶想要的,我的意思是1,「」會評估爲False,而「」或b會評估爲「第二」,這完全是應該發生的事情,不明白爲什麼它是錯的?我錯過了什麼?

回答

4

不,你不會錯過什麼。

expr if cond else expr inline conditional被引入到Python 2.5中的PEP 308;在此之前,條件必須是完整的形式

if cond: 
    expr 
else: 
    expr 

然而,人們注意到,expr and cond or expr排序的工作作爲一個內嵌的條件,只要第一個表達式的發生,以評估爲布爾true。由於Python中的大部分內容都是真實的,所以這種語法通常很有用 - 然後,當然有時會失敗。這實際上是添加「適當」內聯條件的動機。

2

「和 - 或詭計」被用來模擬三元條件運算符condition ? if-true : if-false或類似的。由於1在布爾上下文中相當於True,因此表達式預期會產生a,而不是b。所以,教訓是,不要使用和 - 或欺騙。 Python有三元條件自2.5:

true if condition else false 
+0

謝謝,我想還有別的東西我不明白。 –

2

深入Python不是一個很好的教程和should not be followed


之前蟒有一個適當的三元式(y if x else z)中的溶液中所使用的表達x and y or z。這一節是說爲什麼它可以讓你感到驚訝,如果你期望它像C的x ? y : z一樣行事。


有一個在python wiki.教程,可能會給你一個更加最新的資源列表。

+0

好zed肖咆哮。 – gary

+0

我應該遵循什麼呢?我認爲潛入Python應該足以作爲例子。我意識到語法,我正在尋找示例來看看如何用python更好地完成事情 –

+0

@KartikAnand:我的答案中的鏈接有在「學習Python」部分下的很多選項(你可能注意到DIP沒有以任何形式存在)。 – Daenyth

0

爲什麼它說,它是不是用戶想要什麼,我的意思是1和「」將 評估爲假,而「」或b將評估爲「第二」,這是 完全應該發生什麼,我不明白爲什麼它錯了?我是否缺少一些東西? ?

我覺得這部分問題被忽略。 condition and if-true or if-false是在版本> 2.5中使用的一種技巧,正如其他答案中所解釋的,用於模擬其他語言的「condition ? if-true : if-false或更高版本」if-true if condition else if-false

它的問題是,如果if-true是計算結果爲假(""[]()False0),那麼這將失敗,當你在評估符合市場預期,但可能蠕變對象作爲錯誤,如果if-true是動態設置的並且可以評估爲false。

condition and a or b的天真期望的結果本來的a"",空字符串)中的內容,作爲條件(1)的計算結果爲true,但作爲1 and a計算結果爲false所以你得到的b內容。

解決此問題的方法是使用Python 2.5+語法(if-true if condition else if-false)或確保if-true從不爲假。完成第二個方式是打包在一個元組或列表if-trueif-false,作爲一個非空可迭代永遠是正確的:

>>> a = "" 
>>> b = "second" 
>>> condition = 1 
>>> condition and a or b 
'second' 

>>> condition and [a] or [b] 
[''] 

>>> (condition and [a] or [b])[0] 
'' 

這是一種醜陋的解決方案,但它的存在,如果你需要的目標舊版本的Python。

+0

實際上你說的已經在書中給出了,我的問題不是如何糾正錯誤,我的問題是作者爲什麼說「這不是用戶的期望」。其實你在回答的第一部分回答了我的問題,沒有必要使用代碼,謝謝:) –

+0

@KartikAnand:當然,我只是想以確保如果有人在將來發現這個問題,他們將有充分的背景:) – voyager