内置函数就是无需用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)