日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

【Python 第51課】 and

 一利陽光故事會 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"。
拋開繞人的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ī)會再說。          

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多