1. 關(guān)于python中bool類型的重要細(xì)節(jié)

        共 1951字,需瀏覽 4分鐘

         ·

        2021-01-28 14:20



        0. 導(dǎo)讀

        大家好,歡迎來到 Crossin的編程教室 !
        布爾類型是Python中必不可少的一種數(shù)據(jù)類型。它看起來很簡(jiǎn)單,僅包括True和False兩種類型,但你不一定真的了解它的細(xì)節(jié)……

        1. 首次引進(jìn)

        2002年3月,龜叔首次在PEP285中首次明確在python中引進(jìn)布爾類型,并包括兩個(gè)實(shí)例:"True"和"False"


        2. 繼承于int

        布爾類型是int型的一個(gè)子類,意味著"True"=1,"False"=0:
        1print(True?==?1)?#?輸出True
        2print(False?==?0)?#?輸出True


        當(dāng)然,也支持對(duì)布爾值和int值進(jìn)行簡(jiǎn)單的計(jì)算:
        1True?+?2?#?輸出3
        23?*?False?#?輸出0




        3. 布爾取值

        其他編程語言中,可能布爾值會(huì)寫作"true"和"false",但在python中必須首字母大寫:
        1a?=?true
        2#?NameError:?name?'true'?is?not?defined


        4. 何為真假

        在python中,數(shù)值0(各種類型下的數(shù)值0)、空字符串、空列表等以及特殊的None值在判斷真假時(shí),將被判斷為False:
        1bool(0)?#?整型0?False
        2bool(0.0)?#?浮點(diǎn)數(shù)0?False
        3bool(None)?#?None值?False
        4bool('')?#?空字符串?False
        5bool([])?#?空列表?False
        6bool([None])?#?含有None的列表?True


        5. 全局實(shí)例

        由于布爾類型僅有兩個(gè)取值,所以所有True或者False具有相同的實(shí)例地址:
        1a?=?True
        2b?=?1?==?1
        3print(id(True))?#140734530754896
        4print(id(a))?#140734530754896
        5print(id(b))?#140734530754896



        6. 邏輯運(yùn)算

        與很多編程語言也不同,python中的布爾邏輯運(yùn)算符是and、or和not,而不是&、||、~(分別代表了二進(jìn)制位運(yùn)算中的邏輯與、或、非):
        1bool(3?and?4)?#?True
        2bool(3?&?4)?#?False 因?yàn)?&4的位運(yùn)算結(jié)果為0


        三種邏輯運(yùn)算優(yōu)先級(jí)為not>and>or:
        10?or?1?and?not?2
        2#?False


        7. 短路特性

        短路特性意味著在and或or中,一個(gè)值可以判斷出結(jié)果時(shí),不再對(duì)后一個(gè)值進(jìn)行判斷,且返回值為可以得出結(jié)果的那個(gè)值:
        13?and?4?#輸出4
        20?and?4?#輸出0
        33?or?4?#輸出3
        40?or?4?#輸出4


        利用這一特點(diǎn),在有些程序設(shè)計(jì)中非常有用。例如判斷一個(gè)列表中最后一個(gè)元素是否大于0時(shí),由于不確定列表是否為空,所以直接按下標(biāo)取值可能引發(fā)錯(cuò)誤,比較穩(wěn)妥的判斷方式為:
        1lyst?=?[]
        2#可能引發(fā)錯(cuò)誤的寫法
        3if?lyst[-1]>0:?#?IndexError:?list?index?out?of?range
        4????print('ok')
        5#?穩(wěn)妥的寫法
        6if?lyst?and?lyst[-1]>0:
        7????print('ok')


        8. 龜叔關(guān)于布爾值的一些答復(fù)

        在PEP285文檔中,龜叔給出了社區(qū)關(guān)于布爾類型的一些議論及答復(fù)。簡(jiǎn)要列舉如下:


        1. str(True)應(yīng)該返回"True"還是"1"?

        ? ??答:"True"。雖然True = 1,但str(True)=?"1",不如"True"來得直觀。


        2. 新手傾向于寫“ if x == True”?

        ????答:實(shí)際上寫“ if x”就足夠了,會(huì)自動(dòng)轉(zhuǎn)化為布爾型進(jìn)行真值判斷。


        3. 將來會(huì)取消布爾值的非布爾運(yùn)算?例如使True+1非法?

        ????答:不會(huì),布爾值應(yīng)始終允許算術(shù)運(yùn)算。


        4. 用boolean替代bool的寫法?

        ????答:不會(huì)。python一直主張簡(jiǎn)潔,例如def、int和dict都是縮寫,雖然bool對(duì)于新手而言不如boolean更直觀,但它只是一個(gè)單詞而已。


        5. 將來是否會(huì)要求布爾運(yùn)算有明確的布爾值作為參數(shù)?例如"if []"變得非法,而必須寫作"if bool([])"?

        ????答:不會(huì),至少龜叔不會(huì)同意。(再次說明python語法之簡(jiǎn)潔)




        最后給出一個(gè)小彩蛋:

        求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等關(guān)鍵字及條件判斷語句(A?B:C)。


        示例 1:

        輸入: n = 3

        輸出: 6

        ?

        限制:1 <= n <= 10000


        來源:力扣(LeetCode) 劍指offer 64#題

        簡(jiǎn)單的求和問題,但由于不允許用乘除法、循環(huán)和條件判斷,所以原本簡(jiǎn)單的問題變得有些棘手。如果了解python布爾值是int子類和邏輯運(yùn)算符的短路特性,就可以理解如下實(shí)現(xiàn)方法:
        1def?sumNums(self,?n:?int)?->?int:
        2????return?n?and?(n?+?sumNums(n-1))

        作者:luanhz
        來源:小數(shù)志


        _往期文章推薦_

        Python的新功能“類型注解”有什么作用?




        瀏覽 22
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 无码精品成人观看A片 | 婷婷丁香五月天操逼网 | 免费瑟瑟视频 | 国产一区免费观看 | 四个黑人玩一个少妇四p |