《Python工匠》学习笔记----第四章:条件分支控制流

分支表达式判断

省略零值的判断

当某对象作为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的
对象。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值