今天介紹一個(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"。
拋開繞人的and和or的邏輯,你只需記住,在一個(gè)bool and a or
b語句中,當(dāng)bool條件為真時(shí),結(jié)果是a;當(dāng)bool條件為假時(shí),結(jié)果是b。
有學(xué)過c/c++的同學(xué)應(yīng)該會發(fā)現(xiàn),這和bool?a:b表達(dá)式很像。
有了它,原本需要一個(gè)if-else語句表述的邏輯:
1. if a > 0:
2.
print "big"
3. else:
4.
print "small"
就可以直接寫成:
1. print (a > 0) and "big" or
"small"
2.
然而不幸的是,如果直接這么用,有一天你會踩到坑的。和c語言中的?:表達(dá)式不同,這里的and
or語句是利用了python中的邏輯運(yùn)算實(shí)現(xiàn)的。當(dāng)a本身是個(gè)假值(如0,"")時(shí),結(jié)果就不會像你期望的那樣。
比如:
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的值不會為假。最常用的方式是使 a 成為 [a] 、 b 成為[ b ]
,然后使用返回值列表的第一個(gè)元素:
1. a = ""
2. b = "hell"
3. c = (True and [a] or
[b])[0]
4. print c
由于[a]是一個(gè)非空列表,所以它決不會為假。即使a是0或者''或者其它假值,列表[a]也為真,因?yàn)樗幸粋€(gè)元素。
在兩個(gè)常量值進(jìn)行選擇時(shí),and-or會讓你的代碼更簡單。但如果你覺得這個(gè)技巧帶來的副作用已經(jīng)讓你頭大了,沒關(guān)系,用if-else可以做相同的事情。不過在python的某些情況下,你可能沒法使用if語句,比如lambda函數(shù)中,這時(shí)候你可能就需要and-or的幫助了。
什么是lambda函數(shù)?呵呵,這是python的高階玩法,暫且按住不表,以后有機(jī)會再說。
|