關於python中bool類型,你需要知道這些細節…

2021-02-19 Python之禪

布爾類型很簡單,僅包括True和False兩種類型,但你不一定真的了解……

2002年3月,龜叔首次在PEP285中首次明確在python中引進布爾類型,並包括兩個實例:"True"和"False"

布爾類型是int型的一個子類,意味著"True"=1,"False"=0:

1print(True == 1) # 輸出True
2print(False == 0) # 輸出True

1True + 2 # 輸出3
23 * False # 輸出0

其他程式語言中,可能布爾值會寫作"true"和"false",但在python中必須首字母大寫:

1a = true
2# NameError: name 'true' is not defined

在python中,數值0(各種類型下的數值0)、空字符串、空列表等以及特殊的None值在判斷真假時,將被判斷為False:

1bool(0) # 整型0 False
2bool(0.0) # 浮點數0 False
3bool(None) # None值 False
4bool('') # 空字符串 False
5bool([]) # 空列表 False
6bool([None]) # 含有None的列表 True

由於布爾類型僅有兩個取值,所以所有True或者False具有相同的實例地址:

1a = True
2b = 1 == 1
3print(id(True)) #140734530754896
4print(id(a)) #140734530754896
5print(id(b)) #140734530754896

與很多程式語言也不同,python中的布爾邏輯運算符是and、or和not,而不是&、||、~(分別代表了二級制位運算中的邏輯與、或、非):

1bool(3 and 4) # True
2bool(3 & 4) # False 因為3&4的位運算結果為0

10 or 1 and not 2
2# False

短路特性意味著在and或or中,一個值可以判斷出結果時,不再對後一個值進行判斷,且返回值為可以得出結果的那個值:

13 and 4 #輸出4
20 and 4 #輸出0
33 or 4 #輸出3
40 or 4 #輸出4

利用這一特點,在有些程序設計中非常有用。例如判斷一個列表中最後一個元素是否大於0時,由於不確定列表是否為空,所以直接按下標取值可能引發錯誤,比較穩妥的判斷方式為:

1lyst = []
2#可能引發錯誤的寫法
3if lyst[-1]>0: # IndexError: list index out of range
4    print('ok')
5# 穩妥的寫法
6if lyst and lyst[-1]>0:
7    print('ok')

在PEP285文檔中,龜叔給出了社區關於布爾類型的一些議論及答覆。簡要列舉如下:

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

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

2. 新手傾向於寫「 if x == True」?

    答:實際上寫「 if x」就足夠了,會自動轉化為布爾型進行真值判斷。

3. 將來會取消布爾值的非布爾運算?例如使True+1非法?

    答:不會,布爾值應始終允許算術運算。

4. 用boolean替代bool的寫法?

    答:不會。python一直主張簡潔,例如def、int和dict都是縮寫,雖然bool對於新手而言不如boolean更直觀,但它只是一個單詞而已。

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

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

最後給出一個小彩蛋:

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

示例 1:

輸入: n = 3

輸出: 6

 

限制:1 <= n <= 10000

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

簡單的求和問題,但由於不允許用乘除法、循環和條件判斷,所以原本簡單的問題變得有些棘手。如果了解python布爾值是int子類和邏輯運算符的短路特性,就可以理解如下實現方法:

1def sumNums(self, n: int) -> int:
2    return n and (n + sumNums(n-1))

相關焦點

  • 關於python中bool類型的重要細節
    Python中必不可少的一種數據類型。它看起來很簡單,僅包括True和False兩種類型,但你不一定真的了解它的細節……2002年3月,龜叔首次在PEP285中首次明確在python中引進布爾類型,並包括兩個實例:"True"和"False"布爾類型是int型的一個子類,意味著"True"=1,"False"=0:1print(True == 1) # 輸出True2print(False ==
  • Python中除了Bool類型,你還知道真值假值嗎?
    Bool類型是Python內置的基本類型,我們經常使用比較操作符邏輯操作符表達式配合條件判斷語句或while循環語句去實現代碼邏輯
  • Python學習入門到精通:bool數據類型
    概念講解bool數據類型只有兩個值,分別是True,False。在現實世界中,真,正確,對,正,這組詞彙表示了一種肯定的意思,與之相對應的則是假,錯誤,錯,反。在python語言中,True就等同於真,正確,對,正, False等同於假,錯誤,錯,反。
  • Python 基本數據類型簡介int/str/bool
    一、python基本數據類型1. int ==> 整數.在python3中所有的整數都是int類型. 但在python2中如果數據量比較大. 會使用long類型. 在python3中不存在long類型整數可以進行的操作: bit_length().
  • 【Python 第3課】bool值,你和我做夢時寫的代碼一樣
    上次我們說到Python的基本類型,這個是基本,比較容易理解。今天要跟大家分享一下的知識點,叫做bool(布爾值)。
  • numpy中的數據類型對象有哪些
    數據類型以上就是一系列Numpy中提供的數據類型。需要理解的是,Numpy中的數據類型,和python本身的數據類型是不同的。Numpy中的數據類型,實質是數據類型對象dtype的實例。Numpy中的Ndarray對象可以幫助我們構建N維數組對象。我們知道,對於數組來說,最大特點是,對於給定長度的數組,其在內存中所佔用的空間大小是預先分配的,並且,每個元素所佔用的空間大小是相當的。那麼,Ndarray怎麼計算每個元素所佔用的空間大小呢?就是根據dtype。換句話說,dtype定義中,應該包含類型的名字,並且,能夠明確該類型實例佔用的內存空間大小。
  • python數據類型總結——布爾
    在python中,我們經常會遇到是或否的判斷。根據是或否,來絕對後續的處理邏輯。那麼,是或否在python中,用布爾來描述,英文名為bool。python布爾python中, 可以通過type函數來獲取一個對象的類名,如下:
  • Python中的數據類型
    計算機不僅可以處理各種數值,還可以處理各種各樣的數據,因此我們需要定義不同的數據類型。本期我們主要分享Python中,能夠直接處理的、常見的四種數據類型:1.整數(int)python可以處理任意大小的整數,當然包括負整數,在python程序中,整數的表示方法和數學上的寫法一模一樣,例如:1,100,-8080,0,等等。
  • Python數據類型串講(上)
    編程的底層也就是我們常說的基礎,下面將從python的基礎中的數據類型開始入門。何為數據?在計算機科學中,數據是指所有能輸入到計算機並被電腦程式處理的符號的介質的總稱,是用於輸入電子計算機進行處理,具有一定意義的數字字母、符號和模擬量等的統稱。2、數據類型的作用python的標準數據類型共有六種,為什麼要將數據分為不同的類型呢?
  • C/C++數據類型bool
    布爾類型 bool作用:布爾數據類型代表真或假的值bool類型只有兩個值:true --- 真(本質是1)false --- 假(本質是0)bool類型佔1個字節大小示例:int main() {bool flag = true
  • Python 為什麼要在 18 年前引入布爾類型?且與 C、C++ 和 Java 都不同?
    這個 PEP 意義非常重大,Python 的 bool 類型就是從它開始引入的,而我在上篇文章中分析到的很多問題,都能在這篇十幾年前的文檔中找到解釋!另外它還回應了比較典型的一些爭議,值得大家了解下。這個 bool 類型是 int 類型的直接子類型(在 C 中),並且在除了 repr() 和 str() 之外的大多數方面,它的值False和True 都將表現得像是 0 和 1(例如,False == 0 和 True == 1 都為真)。
  • Python 入門系列 —— 12. Booleans 介紹
    Boolean 值 在編程中經常需要知道一個表達式到底是 True 還是 False,在 Python
  • 變量類型測試函數的使用一、is_bool的用法
    昨天剛講完PHP基礎知識數據類型之間相互轉換,今天就來講講PHP變量類型測試函數的使用。在PHP編碼過程中也非常常用到變量類型測試函數,那麼現在我就來給大家講解is_bool的基本知識。is_boolis_bool(字面意思) — 檢測變量是否是布爾型描述is_bool ( mixed var):bool「is_bool函數參數可以混合類型「混合類型:一個參數可以接受多種不同的類型」;返回結果呢,肯定是返回布爾類型 TRUE
  • Python 四大數據類型總結
    基本數據類型數值型Python 中的數據皆是對象,比如被熟知的 int 整型對象、float 雙精度浮點型、bool 邏輯對象,它們都是單個元素。舉兩個例子。Python 定義這些類型的變量,語法非常簡潔。舉例如下。
  • Python基礎數據類型int和bool和str
    基礎數據類型什麼是數據: x = 10, 10是我們要存儲的數據為什麼分數據類型: 數據是用來表示狀態的, 不同的狀態就應該用不同的類型的數據去表示。數字 int數字主要用於計算用# bit_length() 當十進位用二進位表示時,最少使用的位數v=11data=v.bit_length()print(data)布爾值 bool布爾值就兩種: True,False。
  • Python3的簡單基本類型(瘋狂Python)
    本篇文章的涵蓋的內容如下:Python中的如何使用注釋?Python中的變量需要聲明嗎?多個變量怎樣賦值?Python中的變量需要聲明嗎?1-1 變量不需要聲明。變量在使用前都必須賦值,賦值後該變量才會被創建。1-2 Python 中,變量就是變量,它沒有類型(內存中對象的類型)1-3 等號(=)用來給變量賦值。
  • Python基礎——基本數據類型(1)
    中有六個標準的數據類型:標準的數據類型圖Python3 的六個標準數據類型中:不可變數據:Number(數字)、String(字符串)、Tuple(元組); 可變數據:List(列表)、Dictionary
  • 隨筆:code.org與python,FoxDot,Lisp
    作為函數語言的優勢,如《流暢的python》一書中詳細介紹的,python自定義的數據類型可以跟系統自帶的數據類型有相同的操作,因為在橫向上,python定義了一系列的模式方法,可以讓自定義的數據類型,擁有跟內置類型完全相同的操作,len、str以及加減乘除、遍歷等操作,可以方便的通過魔術方法實現,所以FoxDot為自定義的數據類型player對象,借用原來的位操作符>>>,實現了簡潔到極點的代碼
  • python中的這些坑,早看早避免.
    因為,Python中的字典是通過檢查鍵值是否相等以及哈希值來確定兩個鍵是否相同.具有相同值的不可變對象在Python中始終具有相同的哈希值.因為1=1.0所以hash(1)==hash(1.0).同樣的我們知道python中的true相等,我們試著計算其hash值可以看到hash(1)==hash(True)。
  • C++ 20中的explicit(bool)介紹
    一句話開頭explicit(bool)是C++ 20中的一個特性,這個特性用於檢查通用類型的實現並且可以減少編譯時間。細說explicit(bool)在C++中,通過將對象封裝成其他類型的技法十分常見,例如std::pair和std::optional就是兩個十分典型的例子。並且,在C++標準庫,Boost或者你自己的代碼庫中,我們還可以看到許多類似的使用。