2011-11-07 91 views
4

我使用三元運算符作爲短條件變量定義。我想知道什麼時候表達式返回True,而不是在表達式值中給出。三元運算符返回`True`而不是給定值

>>> digits = '123456' 

>>> conv_d = digits != None if int(digits) else None 

>>> conv_d 
>>> True 

>>> int(digits) 
>>> 123456 

請向我解釋這是怎麼發生的? Python中的三元運算符和常規條件表達式之間的邏輯區別是什麼?

回答

7

int(digits) == 123456這是一個真正的價值。所以conv_d = digits != None。由於digits不是None,因此conv_d設置爲true。

你可能想要這個:

conv_d = int(digits) if digits is not None else None 

請記住,包含一些字符串不是一個數字,雖然會引發異常!如果您對這些值更喜歡0或無,請編寫一個小函數:

def toint(s): 
    try: 
     return int(s) 
    except (ValueError, TypeError): 
     return None # or 0 
+0

非常好!謝謝。 – I159

5

Python條件運算符與其他語言的順序不同。除非您確定需要,否則您絕對不應該與None進行比較。

conv_d = int(digits) if digits is not None else None 
0

替代三元運算符:

conv_d =位數=無和INT(數字)或無#短路;!只是錯在這種情況下,因爲它不包括數字字符=「0」 - 下面

conv_d = INT(數字)請參閱評論(縣)如果數字不無其他無

第二個表達式更清晰,因此更受歡迎。

+0

如果'int(digits)'爲0,則第一個將失敗。如果'digits'不與'None'進行公平比較,則兩者都會失敗。 –

+0

感謝您收到第一個錯誤!這個想法僅僅是爲了表明在Python中有一些替代方案可以用於缺少三元運算符,所以我簡單地認爲數字是由[0-9]或None組成的一個str(無論如何,ThiefMaster的回覆都涵蓋了這個問題)。鑑於此,我同意在與None比較時,「不是」是首選運營商。 – buckdeer

0

注意如何放置關鍵字。 「X如果Y否則Z」。 「Y」是跟隨「if」的部分,所以它是條件。 「如果Y是X」是完全有效的(雖然不太常見)英語結構,意思與「如果Y,X」是相同的事物,因此X是當Y被滿足時評估的表達。類似地,Z是當Y不滿意時評估的表達式。