国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python中 ? : 三元表達(dá)式的使用介紹

2020-02-23 04:55:04
字體:
供稿:網(wǎng)友

(1) variable = a if exper else b
(2)variable = (exper and [b] or [c])[0]
(2) variable = exper and b or c

上面三種用法都可以達(dá)到目的,類似C語言中 variable = exper ? b : c;即:如果exper表達(dá)式的值為true則variable = b,否則,variable = c

例如:

代碼如下:
a,b=1,2
max = (a if a > b else b)
max = (a > b and [a] or [b])[0] #list
max = (a > b and a or b)


現(xiàn)在大部分高級語言都支持“?”這個三元運(yùn)算符(ternary operator),它對應(yīng)的表達(dá)式如下:condition ? value if true : value if false。很奇怪的是,這么常用的運(yùn)算符python居然不支持!誠然,我們可以通過if-else語句表達(dá),但是本來一行代碼可以完成的非要多行,明顯不夠簡潔。沒關(guān)系,在python里其實還是有對應(yīng)的表達(dá)方式的。

舉個例子:char *ret = (x!=0) ? "True" : "False"這行代碼對應(yīng)的python形式就是ret = (x and "True") or "False"(很簡單吧,事實上括號可以去掉)。運(yùn)行時,python虛擬機(jī)會對賦值符右邊的布爾表達(dá)式(注意這里并非三元表達(dá)式)求值,返回值是最后一個被分析到的值。為什么是“最后一個被分析到的”而不是表達(dá)式中“最后一個”呢?因為布爾表達(dá)式有一個短路效應(yīng),比如a or b,如果a為真那么就不會分析b了。嗯,估計現(xiàn)在大家差不多明白了這行python代碼的原理了。如果x為真,由于字符串“True”也為真,于是返回"True",反之,x為假,那么就沒必要看字符串"True"了(短路效應(yīng)),直接返回"False"。

不難看出,三元運(yùn)算在python中事實上可以通過借用布爾求值表達(dá)。然后,有時會有點小問題。舉個例子,char *ret = x ? "" or "VAL"。根據(jù)前面的例子,我們很自然想到在python里應(yīng)該這樣寫,ret = x and "" or "VAL"。錯了!不管x的布爾求值是真還是假,ret得到的總是"VAL"。奇怪么?不奇怪,因為在python中對空字符串的布爾求值為false,這樣x and ""永遠(yuǎn)都是false,所以ret得到的自然總是"VAL"了。解決這個問題有兩種辦法,第一種,也是我喜歡的一種,就是寫成ret = not x and "VAL" or ""。第二種,麻煩一點ret=x and [""] or ["VAL"],然后每次取ret[0]作為返回值,這是因為[""]在布爾求值時值為true。

討論一:第一種方法代碼明顯要簡潔,效率也高,那么還有必要使用第二種么?當(dāng)然,第一種辦法有局限性,只有當(dāng)我們非常明確其中一個值布爾求值時不可能為false時才能使用。在我們的示例中,由于"VAL"肯定返回true所以可以使用。如果是兩個變量呢,像這樣ret=x and val1 or val2,你就只能老老實實寫成ret=x and [val1] or [val2],然后取ret[0]作為結(jié)果了。因為這行語句所表達(dá)的不是“當(dāng)x為真返回val1,否則返回val2”,而是“當(dāng)x為真并且val1為真返回val2,否則返回val2”。

討論二:大家都知道python里有l(wèi)ist和tuple,前面這行代碼ret=x and [""] or ["VAL"]我們就是通過list解決,有的人可能偏愛tuple,于是就會這樣寫ret=x and ("") or ("VAL")。錯了!這里ret[0]永遠(yuǎn)都是空字符串(在2.5上測試)。這是我比較faint的一點,為啥[""]為真而("")為假呢?

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 育儿| 高雄县| 防城港市| 云安县| 蒙山县| 调兵山市| 武陟县| 灌阳县| 长子县| 甘孜| 晋城| 砀山县| 达孜县| 盘锦市| 疏勒县| 宜州市| 临西县| 万源市| 新密市| 永泰县| 蓬安县| 郑州市| 韩城市| 辉南县| 柯坪县| 元江| 天台县| 廊坊市| 宣城市| 东阿县| 玉林市| 绵竹市| 华坪县| 巍山| 穆棱市| 南宁市| 故城县| 河间市| 余江县| 诸暨市| 鄢陵县|