测试真值
每个对象都可以进行真值测试,便于在 if 或 while 条件内使用,或在布尔运算中用作操作数。默认情况下,除非对象的类显式定义了返回 False 的 bool() 方法或在对象上调用时返回零的 len() 方法,否则该对象被视为 true。下面表示通常被视为 false 的内置对象:
- 定义为 false 的常量:None 和 False。
- 任何数字形式的零:0、0.0、0j、Decimal(0)、Fraction(0、1)。
- 空序列和集合:''、()、[]、{}、set()、range(0)。
除非另有明确规定,否则生成布尔结果的运算和内置函数始终为错误结果生成 0 或 False,对于真实结果生成 1 或 True。值得注意的是,布尔运算符“or”和“and”总是返回它们的操作数之一。
布尔运算:and、or、not
布尔运算“and”、“or”和“not”根据其各自的操作数和优先级表现出不同的行为。它们按优先级升序列在下面:
操作:x 或 y
结果:如果 x 为 true,则 x;否则,y。
操作:x 和 y
结果:如果 x 为 false,则 x;否则,y。
操作:不是 x
结果:如果 x 为 false,则为 True;否则为 False。
注意事项:
- “or”运算符是短路运算符,仅当第一个参数为 false 时才计算第二个参数。
- “and”运算符也是一个短路运算符,仅当第一个参数为真时才评估第二个参数。
- “not”运算符的优先级低于非布尔运算符,因此“not a == b”被解释为“not (a == b)”。相反,“a == not b”表示语法错误。
比较
Python 提供了八种比较操作,所有操作都具有相同的优先级(高于布尔运算)。这些操作可以任意链接。例如,表达式“x < y <= z”等效于“x < y 和 y <= z”。值得注意的是,将“x < y”计算为 false 可以完全避免计算 z。
下表总结了可用的比较操作:
<小 <= 小于或等于
>大于 ,>= 大于或等于 ,== 等于 ,!= 不等于。
在 Python 中,不同类型的对象(不包括不同的数值类型)永远不会被认为是相等的。虽然“==”运算符始终被定义,但对于某些对象类型(例如,类对象),它等同于“is”。另一方面,运算符“<”、“<=”、“>”和“>=”是有选择地定义的,当应用于不兼容的类型(如复数)时,会引发 TypeError 异常。
默认情况下,类的实例比较为不相等,除非该类定义了 eq() 方法。类的实例不能相对于同一类的其他实例或其他对象类型直接排序,除非该类定义了必要的方法:lt()、le()、gt() 和 ge()。
“is”和“is not”运算符不可自定义,可以应用于任意两个对象而不会引发异常。
此外,Python 支持两个语法优先级相等的操作:“in”和“not in”。这些操作适用于可迭代或实现 contains() 方法的类型。
数值类型:int、float、complex
Python 包含三种不同的数值类型:整数、浮点数和复数。布尔值作为整数的子类型,也属于这一类。整数具有无限的精度,而浮点数通常在 C 中使用 double 实现。有关浮点数的计算机特定信息,请参阅sys.float_info。复数由实数和虚数部分组成,两者都表示为浮点数。从复数 z 中提取实部和虚部可以分别使用 z.real 和 z.imag 来实现。
可以使用文本、内置函数和运算符创建数值。朴素的整数文本(包括十六进制数、八进制数和二进制数)表示整数值。包含小数点或指数符号的数字文本表示浮点数。将“j”或“J”附加到数字文字中会产生一个实数为零的虚数,允许与整数或浮点数相加以创建具有实数和虚数分量的复数。
Python 完全支持混合算术。当二元算术运算符涉及不同数值类型的操作数时,具有“较窄”类型的操作数将被加宽以匹配另一种类型。具体来说,整数比浮点数窄,而浮点数又比复数窄。不同类型数字之间的比较就像比较它们的确切值一样。
构造函数 int()、float() 和 complex() 可以创建特定类型的数字。