今天介紹一個python中的小技巧:and-or
看下面這段代碼:
a = "heaven"
b = "hell"
c = True and a or b
print c
d = False and a or b
print d
輸出:
heaven
hell
結果很奇怪是不是?
表達式從左往右運算,1和"heaven"做and的結果是"heaven",再與"hell"做or的結果是"heaven";0和"heaven"做and的結果是0,再與"hell"做or的結果是"hell"。
拋開繞人的and和or的邏輯,你只需記住,在一個bool and a or b語句中,當bool條件為真時,結果是a;當bool條件為假時,結果是b。
有學過c/c++的同學應該會發現,這和bool?a:b表達式很像。
有了它,原本需要一個if-else語句表述的邏輯:
if a > 0:
print "big"
else:
print "small"
就可以直接寫成:
print (a > 0) and "big" or "small"
然而不幸的是,如果直接這麼用,有一天你會踩到坑的。和c語言中的?:表達式不同,這裡的and or語句是利用了python中的邏輯運算實現的。當a本身是個假值(如0,"")時,結果就不會像你期望的那樣。
比如:
a = ""
b = "hell"
c = True and a or b
print c
得到的結果不是""而是"hell"。因為""和"hell"做and的結果是"hell"。
所以,and-or真正的技巧在於,確保a的值不會為假。最常用的方式是使 a 成為 [a] 、 b 成為 [b],然後使用返回值列表的第一個元素:
a = ""
b = "hell"
c = (True and [a] or [b])[0]
print c
由於[a]是一個非空列表,所以它決不會為假。即使a是0或者''或者其它假值,列表[a]也為真,因為它有一個元素。
在兩個常量值進行選擇時,and-or會讓你的代碼更簡單。但如果你覺得這個技巧帶來的副作用已經讓你頭大了,沒關係,用if-else可以做相同的事情。不過在python的某些情況下,你可能沒法使用if語句,比如lambda函數中,這時候你可能就需要and-or的幫助了。
什麼是lambda函數?呵呵,這是python的高階玩法,暫且按住不表,以後有機會再說。
#==== Crossin的編程教室 ====#
微信ID:crossincode
論壇:http://crossin.me
QQ群:312723402
面向零基礎初學者的編程課
每天5分鐘,輕鬆學編程
回復『 p 』查看python課程
回復『 g 』查看pygame課程
回復『 t 』查看習題
點擊「閱讀原文」進入crossin.me