在java中我們可以通過(guò)?:表達(dá)式簡(jiǎn)潔地進(jìn)行判斷和賦值湾蔓。
例如:
x = ((p != None) ? p.val:0)
y = ((q != None) ? q.val:0)
但是在Python中語(yǔ)法稍有不同椒丧,以下代碼可以實(shí)現(xiàn)相同效果壹甥。
但是這種方法必須確定and后的第一個(gè)值為T(mén)RUE
x = ((p != None) and p.val or 0)
y = ((q != None) and q.val or 0)
用“and”替代“?”并且用 “or” 替代“:”
另一種寫(xiě)法:
x = p.val if (p != None) else 0
y = q.val if (q != None) else 0
這種方法更為保險(xiǎn)。
補(bǔ)充:摘自https://www.cnblogs.com/xxiong1031/articles/7099901.html侵刪
局限性
不難看出壶熏,三元運(yùn)算在python中事實(shí)上可以通過(guò)借用布爾求值表達(dá)句柠。然后,有時(shí)會(huì)有點(diǎn)小問(wèn)題棒假。
舉個(gè)例子溯职,char *ret = x ? "" or "VAL"
。根據(jù)前面的例子帽哑,我們很自然想到在python里應(yīng)該這樣寫(xiě)谜酒,ret = x and "" or "VAL"
。
錯(cuò)了妻枕!不管x
的布爾求值是真還是假甚带,ret
得到的總是"VAL"。因?yàn)樵趐ython中對(duì)空字符串的布爾求值為false佳头,這樣x and ""
永遠(yuǎn)都是false,所以ret
得到的自然總是"VAL"了鹰贵。
解決這個(gè)問(wèn)題有兩種辦法,
第一種康嘉,ret = not x and "VAL" or ""
第二種碉输,ret = x and [""] or ["VAL"]
,然后每次取ret[0]
作為返回值亭珍,這是因?yàn)?code>[""]在布爾求值時(shí)值為true敷钾。
討論一:
第一種方法代碼明顯要簡(jiǎn)潔,效率也高肄梨,那么還有必要使用第二種么阻荒?當(dāng)然,第一種辦法有局限性众羡,只有當(dāng)我們非常明確其中一個(gè)值布爾求值時(shí)不可能為false時(shí)才能使用侨赡。在我們的示例中,由于"VAL"肯定返回true所以可以使用粱侣。如果是兩個(gè)變量呢羊壹,像這樣ret=x and val1 or val2
,你就只能老老實(shí)實(shí)寫(xiě)成ret=x and [val1] or [val2]
齐婴,然后取ret[0]
作為結(jié)果了油猫。因?yàn)檫@行語(yǔ)句所表達(dá)的不是“當(dāng)x為真返回val1,否則返回val2”柠偶,而是“當(dāng)x為真并且val1為真返回val2情妖,否則返回val2”睬关。
討論二:
大家都知道python里有l(wèi)ist和tuple,前面這行代碼ret=x and [""] or ["VAL"]
我們就是通過(guò)list解決毡证,有的人可能偏愛(ài)tuple共螺,于是就會(huì)這樣寫(xiě)ret=x and ("") or ("VAL")
。錯(cuò)了情竹!這里ret[0]永遠(yuǎn)都是空字符串(在2.5上測(cè)試)。這是我比較faint的一點(diǎn)匀哄,為啥[""]為真而("")為假呢秦效?