任何对象都可以进行逻辑值的检测。一个对象默认情况下认为是真。除非改对象所属的类定义了如下方法:
出现假值的情况:
定义测试函数和自定义类:
class Test: def __init__(self) -> None: pass class Test1: def __init__(self, *args) -> None: self.list = list(args) def __len__(self): return len(self.list) class Test2: def __init__(self, *args) -> None: self.list = list(args) def __bool__(self): return len(self.list) > 3 def check(param: bool) -> None: if param: print(f"{param}值为真") else: print(f"{param}值为假")
定义测试用的对象和数值:
number_0 = 0 constant_None = None empty_list = [] test0 = Test() test1_1 = Test1(1, 2, 3) test1_2 = Test1() test2_1 = Test2(1, 2, 3, 4, 5, 6) test2_2 = Test2(1, 2)
测试结果:
0值为假 None值为假 []值为假 <__main__.Test object at 0x00000209C10BBF70>值为真 <__main__.Test1 object at 0x00000209C10BB850>值为真 <__main__.Test1 object at 0x00000209C10BBCD0>值为假 <__main__.Test2 object at 0x00000209C10BB490>值为真 <__main__.Test2 object at 0x00000209C10BBB50>值为假
and、or、not属于布尔运算,
运算 | 结果 | 备注 |
---|---|---|
or | if x is false, then y, else x | 1 |
and | if x is false, then x, else y | 2 |
not | if x is false, then True, else False | 3 |
注释:
or
这是个短路运算符,因此只有在第一个参数为假值时才会对第二个参数求值。and
这是个短路运算符,因此只有在第一个参数为真值时才会对第二个参数求值。not a == b
会被解读为not (a == b)
而a == not b
会引发语法错误。使用and:
counter1 = [] counter2 = [] if counter1 and counter2.append(1): print("表达式值为真") print(f"counter1:{counter1}") print(f"counter2:{counter2}")
测试结果
counter1:[] counter2:[]
使用or:
counter1 = [] counter2 = [] if counter1 or counter2.append(1): print("表达式值为真") print(f"counter1:{counter1}") print(f"counter2:{counter2}")
测试结果:
counter1:[] counter2:[1]
在Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连;例 如,x < y <= z 等价于x < y and y <= z,前者的不同之处在于y只被求值一次(但在两种情况下当x < y 结果为假值时z 都不会被求值)。
除不同的数字类型外,不同类型的对象不能进行相等比较。== 运算符总有定义,但对于某些对象类型(例
如,类对象),它等于is 。其他<、<=、> 和>= 运算符仅在有意义的地方定义。例如,当参与比较的参数
之一为复数时,它们会抛出TypeError 异常。
is
和is not
运算符无法自定义;并且它们可以被应用于任意两个对象而不会引发异常。
内置方法的比较:
自定义一个类,实现__lt__
、__gt__
和__eq__
。
class Test3: def __init__(self, a, b) -> None: self.a = a self.b = b def __eq__(self, other: object) -> bool: return self.a == other.a def __lt__(self, other): return self.b < other.b def __gt__(self, other): return self.b > other.b test3_1 = Test3(1, 2) test3_2 = Test3(1, 4) print(f"==:{test3_1 == test3_2}") print(f">:{test3_1 > test3_2}") print(f"<:{test3_1 < test3_2}")
测试结果:
==:True >:False <:True
存在三种不同的数字类型: 整数, 浮点数和复数。此外,布尔值属于整数的子类型。整数具有无限的精
度。浮点数通常使用C 中的double 来实现;
数字是由数字字面值或内置函数与运算符的结果来创建的。不带修饰的整数字面值(包括十六进制、八进制 和二进制数)会生成整数。包含小数点或幂运算符的数字字面值会生成浮点数。在数字字面值末尾加上’j’ 或’J’ 会生成虚数(实部为零的复数),你可以将其与整数或浮点数相加来得到具有实部和虚部的复数。
Python 完全支持混合运算:当一个二元算术运算符的操作数有不同数值类型时,” 较窄” 类型的操作数会拓 宽到另一个操作数的类型,其中整数比浮点数窄,浮点数比复数窄。不同类型的数字之间的比较,同比较这 些数字的精确值一样。
int
从浮点数转换为整数会被舍入或是像在C 语言中一样被截断。未完待续