电竞比分网-中国电竞赛事及体育赛事平台

分享

【Python 第51課】 and

 一利陽(yáng)光故事會(huì) 2020-02-24

【Python 第51課】 and-or技巧

今天介紹一個(gè)python中的小技巧:and-or

看下面這段代碼:

1.  a = "heaven"

2.  b = "hell"

3.  c = True and a or b

4.  print c

5.  d = False and a or b

6.  print d

輸出:
heaven
hell

結(jié)果很奇怪是不是?
表達(dá)式從左往右運(yùn)算,1和"heaven"做and的結(jié)果是"heaven",再與"hell"做or的結(jié)果是"heaven";0和"heaven"做and的結(jié)果是0,再與"hell"做or的結(jié)果是"hell"。
拋開(kāi)繞人的and和or的邏輯,你只需記住,在一個(gè)bool and a or b語(yǔ)句中,當(dāng)bool條件為真時(shí),結(jié)果是a;當(dāng)bool條件為假時(shí),結(jié)果是b。
有學(xué)過(guò)c/c++的同學(xué)應(yīng)該會(huì)發(fā)現(xiàn),這和bool?a:b表達(dá)式很像。

有了它,原本需要一個(gè)if-else語(yǔ)句表述的邏輯:

1.  if a > 0:

2.      print "big"

3.  else:

4.      print "small"

就可以直接寫成:

1.  print (a > 0) and "big" or "small"

2.   

然而不幸的是,如果直接這么用,有一天你會(huì)踩到坑的。和c語(yǔ)言中的?:表達(dá)式不同,這里的and or語(yǔ)句是利用了python中的邏輯運(yùn)算實(shí)現(xiàn)的。當(dāng)a本身是個(gè)假值(如0,"")時(shí),結(jié)果就不會(huì)像你期望的那樣。

比如:

1.  a = ""

2.  b = "hell"

3.  c = True and a or b

4.  print c

得到的結(jié)果就是"hell"。因?yàn)?"和"hell"做and的結(jié)果是"hell"。

所以,and-or真正的技巧在于,確保a的值不會(huì)為假。最常用的方式是使 a 成為 [a] 、 b 成為[ b ] ,然后使用返回值列表的第一個(gè)元素:

1.  a = ""

2.  b = "hell"

3.  c = (True and [a] or [b])[0]

4.  print c

由于[a]是一個(gè)非空列表,所以它決不會(huì)為假。即使a是0或者''或者其它假值,列表[a]也為真,因?yàn)樗幸粋€(gè)元素。

在兩個(gè)常量值進(jìn)行選擇時(shí),and-or會(huì)讓你的代碼更簡(jiǎn)單。但如果你覺(jué)得這個(gè)技巧帶來(lái)的副作用已經(jīng)讓你頭大了,沒(méi)關(guān)系,用if-else可以做相同的事情。不過(guò)在python的某些情況下,你可能沒(méi)法使用if語(yǔ)句,比如lambda函數(shù)中,這時(shí)候你可能就需要and-or的幫助了。

什么是lambda函數(shù)?呵呵,這是python的高階玩法,暫且按住不表,以后有機(jī)會(huì)再說(shuō)。          

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多