Python內置類型(1)——真值測試


 

python中任何對象都能直接進行真假值的測試,用於if或者while語句的條件判斷,也可以做為布爾邏輯運算符的操作數

python中任何對象都能直接進行真假值的測試,而不需要額外的類型轉換

這一點是和其它語言不一樣的。比如C#,一個非bool的對象,如果要進行邏輯判斷則必須先強制進行類型轉換、或者調用對象的自身判斷方法進行判斷。

var message = " ";
if (message.IsNullOrEmpty()){
    ...
}

而python中可以直接對對象進行邏輯判斷無需類型轉換

message = " "
if message :
    pass

對象的真假值測試的結果,要么是True,要么是False

布爾類型的值只有True和False,所以對象是不管什么類型,其真假值的測試結果必然是True和False中的一個。在python中真假值的測試結果可以通過調用內置函數bool來確認。

>>> bool(' ')
True
>>> bool('')
False

以下的內置對象會被視為False值

  • None
    >>> bool(None)
    False
    
  • False
    >>> bool(False)
    False
    
  • 任何數值類型的零,例如,0、0.0、0j
    >>> bool(0),bool(0.0),bool(0j)
    (False, False, False)
    
  • 任何空序列,例如,”、()、[]
    >>> bool(''),bool(()),bool([])
    (False, False, False)
    
  • 任何空映射,例如,{}
    >>> bool({})
    False
    
    內置對象除了以上值之外的都是真值

常量NotImplemented、Ellipsis、True是真值

>>> bool(NotImplemented)
True
>>> bool(Ellipsis)
True
>>> bool(True)
True

對於用戶自定義的類,其真假值取決於該類有沒有定義__bool__()__len__(),以及這兩個方法返回的值

如果自定義類未沒有定義__bool__()__len__()方法,則該類的實例對象的真假值測試總是True。

>>> class A:
    pass

>>> a =  A()
>>> bool(a)
True

如果自定義類只定義了__bool__()方法,則該類的實例對象的真假值測試結果為__bool__()方法返回的結果

>>> class B():
    def __init__(self,name):
        self.name = name
    def __bool__(self):
        return bool(self.name)

>>> b1 = B('')
>>> bool(b1)
False
>>> b2 = B('jay')
>>> bool(b2)
True

如果自定義類只定義了__len__()方法,則該類的實例對象的真假值測試結果為__len__()方法返回的結果是否為整數0

>>> class C():
    def __init__(self,name):
        self.name = name
    def __len__(self):
        return len(self.name)

>>> c1 = C('')
>>> bool(c1)
False
>>> c2 = C('jay')
>>> bool(c2)
True

如果自定義類同時定義了__bool__()__len__()方法,則該類的實例對象的真假值測試結果為__bool__()方法返回的結果,即__bool__()方法優先級高於__len__()方法。

>>> class D():
    def __len__(self):
        return 1
    def __bool__(self):
        return False

>>> d = D()
>>> bool(d)
False


>>> class E():
    def __len__(self):
        return 0
    def __bool__(self):
        return True

>>> e = E()
>>> bool(e)
True
 
 
 

  

    歡迎關注公眾號交流:

    公眾號二維碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM