zoukankan      html  css  js  c++  java
  • 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
    
     
     
     

      

        欢迎关注公众号交流:

        公众号二维码

  • 相关阅读:
    HDU5890:Eighty seven(Bitset优化背包)
    AtCoder3857:Median Sum (Bitset优化背包&&对称性求中位数)
    POJ3275:Ranking the Cows(Bitset加速floyd求闭包传递)
    Gym
    POJ2443 Set Operation (基础bitset应用,求交集)
    POJ2976:Dropping tests(01分数规划入门)
    HihoCoder1084: 扩展KMP(二分+hash,求T串中S串的数量,可以失配一定次数)
    扩展KMP(占位)
    MySQL主备模式的数据一致性解决方案
    MaxCompute问答整理之6月
  • 原文地址:https://www.cnblogs.com/sesshoumaru/p/python-truth-value-testing.html
Copyright © 2011-2022 走看看