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
欢迎关注公众号交流: