数字类型实战——比较:普通的和链式的

未匹配的标注

到目前为止,一直在和标准数字操作(加法和乘法)打交道,但数字和所有Python对象一样,也是能被比较的。普通的比较操作完全如同期望的那样适用于数字——它们比较运算对象的相对值并返回布尔值的结果,在一个更大的语句和程序中通常将对其进行测试并对此结果采取行动:

>>> 1 < 2 # 小于
True
>>> 2.0 >= 1 # 大于或等于:混合类型 1 转换为 1.0
True
>>> 2.0 == 2.0 # 值相等
True
>>> 2.0 != 2.0 # 值不等
False

再次注意混合类型是如何(只)在数字表达式中被允许的;在这里的第二个测试中,Python用更复杂的类型float来比较值。

有趣的是,Python还允许将多个比较链接在一起来执行范围测试。链式比较是更大的布尔值表达式的一种缩写。简单的说,Python链接起多个值比较测试,来对链式比较如范围测试进行编码。比如,表达式(A<B<C),测试是否B在A和C之间;它等价于布尔测试(A<B和B<C),但看起来更简单(输入也更简单)。比如,假设下面的赋值:

>>> X = 2
>>> Y = 4
>>> Z = 6

下面这两个表达式有相同的效果,但第一个输入更短,且它可以运行得稍微更快一点,因为Python只需要对Y求一次值:

>>> X < Y < Z # 链式比较: 范围测试
True
>>> X < Y and Y < Z
True

同样的等价性也适用于 false 的结果,且任意链接长度都被允许:

>>> X < Y > Z
False
>>> X < Y and Y > Z
False
>>> 1 < 2 < 3.0 < 4
True
>>> 1 > 2 > 3.0 > 4
False

在链式测试中可以使用其他比较,但最终的表达式会变得不直观,除非你像Python那样对它们进行求值。比如,下面这个是false,只是因为1不等于2:

>>> 1 == 2 < 3 # 和 1 == 2 and 2 < 3 相同
False # 和 False < 3 (这意味着 0 < 3, 这不是真的!) 不同

Python 不会将 1 == 2表达式的false结果和3进行比较——技术上这将意味着和 0<3一样,这将会是 True(本章后面将看到:TrueFalse 只是自定义的1和0)。

在继续前进前,这里最后注意一点:将链式比较放在一边,数字比较是基于数值的,它们通常很简单——虽然浮点数可能并不总是如期望的那样工作,且可能需要转换或其他数字处理来更有意义的比较:

>>> 1.1 + 2.2 == 3.3 # 难道这不应该是真吗?...
False
>>> 1.1 + 2.2 # 接近 3.3,但不准确:有限精度
3.3000000000000003
>>> int(1.1 + 2.2) == int(3.3) # 如果转换就正常: 可参见前面的 round, floor, trunc
True # 小数和分数(前面的)或许在这里也有帮助

这个现象来源于因为浮点数数位有限,从而不能精确代表某些数值的事实——这是在数字编程中的一个基本问题,并非Python独有,关于这个问题,在后面遇到小数和分数(可以解决这个限制的工具)时将学习更多。然而,首先让我们更深入的了解下除法,来继续Python的核心数字操作之旅。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~