强基初中数学&学Python——第192课 Python内置函数详解数学篇之一:bool

  内置函数就是无需用import导入,可以在程序中直接使用的函数。

调用:class bool([x])

参数:可选([]中的参数表示可选),只能按位,任何对象或值。

返回:前面有class表示对象构造方法,一定返回这个类的对象。布尔值,True或False。

过程:逻辑值检测”过程对x进行测试,如果 x 为 False 或省略,则返回 False;否则返回 True。

继承:bool类是int类的终子类,不能再被继承。

实例:只要两个实例——False和True。

  逻辑值检测

  因为任何对象都可以进行逻辑值的检测,所以都可以作为if或while的条件和布尔运算的操作数。逻辑值的检测符合下面的规定:

  一个对象在默认情况下均被视为真值True,但在下面两种情况会被认为是假值False:

  (1)对象所属的类定义了 __bool__() 方法,并且在被检测调用时该方法返回False;

  (2)对象所属的类定义了 __len__() 方法,并且在被检测调用时该方法返回零。

  注:如果__bool__()和__len__() 方法都定义了,__bool__()优先,与代码的顺序无关。

  测试代码(文本代码附录1):

 

 

  测试结果

 

  假值的内置对象:

  (1)被定义为假值的常量:None 和 False。

  (2)任何数值类型的零:0,0.0, 0j, Decimal(0), Fraction(0, 1)。

  (3)空的序列和集合: '', (), [], {}, set(), range(0)。

  测试代码(文本代码附录2):

 

  测试结果

 

  除了or和and布尔运算返回其中一个操作数外,其它布尔运算和产生布尔值的运算(例如比较运算)及内置函数(例如bool)总是返回 0 或 False 作为假值,1 或 True 作为真值,除非另行说明。

  测试代码(文本代码附录3):

 

  测试结果

 

  从测试结果中可以看到,or和and运算返回的操作数是最后检测的操作数。例如“10 or 20”,当检测第一个操作数10时,由于10为真值,运算完成,无需检测第二个操作数20,所以返回的是10;又例如“10 and 20”,当检测第一个操作数10时,由于10为真值,继续检测第二个操作数20,所以返回的是20。

 

  练习题:

  1、构建2个有不同方法(method)的类(class),使这2个类的实例作为内置函数bool的参数时都返回假值(False)。

  2、写出下面代码(文本代码附录4)的打印结果,并拷贝代码运行验证。

 

  3、写出下面代码(文本代码附录5)的打印结果,并拷贝代码运行验证。

 

  4、写出下面代码(文本代码附录6)的打印结果,并拷贝代码运行验证。

 

  5、写出下面代码(文本代码附录7)的打印结果,并拷贝代码运行验证。

 

  6、写出下面代码(文本代码附录8)的打印结果,并拷贝代码运行验证。

 

 

 

附录1:

#对象逻辑值检测

#默认对象类

class Default:

    pass   

#定义__bool__()

class BoolMethod:

    def __init__(self):

        self.__b=False

    def __bool__(self):

        self.__b=not self.__b

        print("BoolMethod对象状态:",self.__b)

        return self.__b       

#定义__len__()

class LenMethod:

    def __init__(self):

        self.__l=0

    def __len__(self):

        self.__l=0 if self.__l==1 else 1

        print("LenMethod对象状态:",self.__l)

        return self.__l        

#定义__bool__()和__len__()

class BoolLenMethods:

    def __init__(self):

        self.__b=False

        self.__l=0        

    def __bool__(self):

        self.__b=not self.__b

        print("BoolLenMethods对象状态b:",self.__b)

        return self.__b

    def __len__(self):

        self.__l=0 if self.__l==1 else 1

        print("BoolLenMethods对象状态l:",self.__l)

        return self.__l       

class BoolLenMethods2:

    def __init__(self):

        self.__b=False

        self.__l=0        

    def __len__(self):

        self.__l=0 if self.__l==1 else 1

        print("BoolLenMethods2对象状态l:",self.__l)

        return self.__l    

    def __bool__(self):

        self.__b=not self.__b

        print("BoolLenMethods2对象状态b:",self.__b)

        return self.__b       

print("测试默认对象:")

d = Default()

print("1:",bool(d))

print("2:",bool(d))

print("测试BoolMethod对象:")

bm = BoolMethod()

print("1:",bool(bm))

print("2:",bool(bm))

print("3:",bool(bm))

print("测试LenMethod对象:")

lm = LenMethod()

print("1:",bool(lm))

print("2:",bool(lm))

print("3:",bool(lm))

print("测试BoolLenMethods对象:")

blm = BoolLenMethods()

print("1:",bool(blm))

print("2:",bool(blm))

print("3:",bool(blm))

print("测试BoolLenMethods2对象:")

blm = BoolLenMethods2()

print("1:",bool(blm))

print("2:",bool(blm))

print("3:",bool(blm))

 

附录2:

#假值的内置对象

print("None:",bool(None))

print("False:",bool(False))

print("0:",bool(0))

print("0.0:",bool(0.0))

print("0j:",bool(0j))

from decimal import Decimal

print("Decimal(0):",bool(Decimal(0)))

from fractions import Fraction

print("Fraction(0, 1):",bool(Fraction(0, 1)))

print("'':",bool(''))

print("():",bool(()))

print("[]:",bool([]))

print("{}:",bool({}))

print("set():",bool(set()))

print("range(0):",bool(range(0)))

 

附录3:

#布尔运行测试

print("not 10:", not 10)

print("10 or 0:", 10 or 0)

print("0 or 10:", 0 or 10)

print("20 or 10:", 20 or 10)

print("10 or 20:", 10 or 20)

print("10 and 0:", 10 and 0)

print("0 and 10:", 0 and 10)

print("20 and 10:", 20 and 10)

print("10 and 20:", 10 and 20)

print("20>10:", 20>10)

print("10<20:", 10<20)

print("bool(1.3):", bool(1.3))

 

附录4:

#bool练习题2

class BTest2:

    def __init__(self):

        self.num=0

    def __bool__(self):

        self.num+=1

        return self.num % 10  != 0

    def __str__(self):

        return str(self.num)

bt=BTest2()

while bt:

    pass

print(bt)        

 

附录5:   

#bool练习题3

class BTest3:

    def __init__(self):

        self.len=8

        self.num=0

    def __len__(self):

        self.len-=1

        self.num+=1

        return self.len

    def __str__(self):

        return str(self.num)

bt=BTest3()

while bt:

    pass

print(bt)        

    

附录6:   

#bool练习题4

print(bool(not None))

print(bool(not False))

print(bool(not 0))

print(bool(not 0.0))

print(bool(not 0j))

from decimal import Decimal

print(bool(not Decimal(0)))

from fractions import Fraction

print(bool(not Fraction(0, 1)))

print(bool(not ''))

print(bool(not ()))

print(bool(not []))

print(bool(not {}))

print(bool(not set()))

print(bool(not range(0)))

 

附录7:   

#bool练习题5

print(not -1.23)

print(-1.23 or 0.0)

print(0.0 or -1.23)

print(1.23 or -1.23)

print(-1.23 or 1.23)

print(-1.23 and 0.0)

print(0.0 and -1.23)

print(1.23 and -1.23)

print(-1.23 and 1.23)

print(1.23>-1.23)

print(-1.23<1.23)

print(bool(-1.23))

 

附录8:   

#bool练习题6

class BTest6:

    def __init__(self):

        self.__num=10             

    def __len__(self):

        self.__num-=1

        return self.__num    

    def __bool__(self):

        self.__num+=1

        return self.__num % 10 != 0    

    def __str__(self):

        return str(self.__num)   

bt=BTest6()

while True:

    if not bt:

        break

print(bt)