当前位置:   article > 正文

《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__,强制修改了逻辑,返回自定义值。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

-------------------------------------------------------------------------------------------------

==与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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

因此由于==运算符可以被重载,其正确性就难以保证。相对于==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的
对象。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/166933
推荐阅读
相关标签
  

闽ICP备14008679号