分支表达式判断
省略零值的判断
当某对象作为if 分支的主角时
if exp:
,解释器会对其进行真值测试,即bool(exp)
,对于不同类型,计算布尔值都有着不同的规则,例如对于整型变量,为0代表False,对于列表,空列表代表False等。现将规则统计如下:
(1)False:None,0,False,[],(),{},set(),frozenset()等
(2)True:非0数值,True,非空的容器类型,用户自定义的类和实例
对于用户自定义的类或实例,默认调用bool方法时为True,可通过重写类的_bool_方法,以更改bool()方法的逻辑。类似方法同样适用于更改len()函数获的逻辑。
class A:
def __init__(self,data):
self.data=data
def __len__(self):
return len(self.data)
class B:
def __init__(self,data):
self.data=data
def __len__(self):
return 100
def __bool__(self):
return False
nums=[1,2,3,4,5]
a=A(nums)
b=B(nums)
print(len(a),bool(a))#5 True
print(len(b),bool(b))#100 False,通过自定义__bool__与__len__,强制修改了逻辑,返回自定义值。
-------------------------------------------------------------------------------------------------
==与is
上面提到对于
len(x)
与bool(x)
可通过类内函数__bool__
与__len__
重载,以自定义逻辑。同样,对于运算符==
也可以使用类内函数__eq__
进行重载,例如无论什么情况都强制返回相等。
class A:
def __init__(self,str):
self.str=str
def __eq__(self, other):
"""
:param other: 表示==运算符右边的变量,如x==y,调用x对象的__eq__函数,此时other参数就是y
:return:
"""
return True
a=A("str")
print(type(a),a==3.14)#<class '__main__.A'> True,可见a与3.14的类型都不一致,但仍强制返回了True
因此由于
==
运算符可以被重载,其正确性就难以保证。相对于==
,is
运算符更为可靠。
(1)==对比值是否相等,可以被__eq__
重载。
(2)is对比内存地址是否相等,不可被重载。
all()与any()
(1)all(iterable)—当可迭代对象的所有成员布尔值都为True,才返回True
(2)any(iterable)—当可迭代对象的存在成员布尔值为True,就返回True
or陷阱
and优先级高于or
“短路求值”特性:a or b or c or d...
只会返回这些变量里第一个为True的
对象。