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
歡迎關注公眾號交流: