2.1 引言
第一章聚焦于计算过程与函数的作用:用原始数据与原始操作构造表达式,用组合与控制搭建复合函数,用命名建立抽象,并感受高阶函数在提炼通用模式时的威力。编程的核心是把复杂过程拆解成清晰的组合和抽象。
这一章的主角换成了数据。我们要学习如何表示、组合、抽象和处理各种信息。互联网让海量结构化数据随手可得,计算也因此渗透到几乎所有领域。掌握内置数据类型并能自定义数据类型,是所有数据处理应用的基石。
2.1.1 原始数据类型
每个 Python 值都有一个类(class)来确定其类型。同一类的值行为一致,例如整数 1 和 2 都是 int,可以用相同方式运算。内置的 type 函数能查看任意值的类。
>>> type(2)
<class 'int'>我们目前用到的几乎都是内置的少量原始数据类型。它们的共同点:
- 有能直接求值的字面量(literal)。
- 语言内置了操作该类型的函数与运算符。
例如,int 表示整数。整数字面量求值后就是 int,算术运算符可直接作用其上。
>>> 12 + 3000000000000000000000000
3000000000000000000000012Python 还内置两种数字类型:浮点数(float)和复数(complex)。
>>> type(1.5)
<class 'float'>
>>> type(1+1j)
<class 'complex'>浮点数:“float” 得名于许多语言的小数点“浮动”表示。本书不深入底层表示,但要记住 int 与 float 的差别:int 可以精确表示任意大的整数;float 覆盖范围更广但是近似值,有上下界。多个 float 运算会累积误差;理论上都等于 7 的表达式可能产生不同近似。
译者注:不同于很多语言,Python 3 的
int无上限,可存储任意大的整数,详见 PEP 237。
>>> 7 / 3 * 3
7.0
>>> 1 / 3 * 7 * 3
6.999999999999999即便除法的两边都是 int,结果也会变成 float,得到真实比值的近似。
>>> type(1/3)
<class 'float'>
>>> 1/3
0.3333333333333333在做相等性比较时,这种近似就会显形。
>>> 1/3 == 0.333333333333333312345 # 注意浮点近似
Trueint 与 float 的细微差异会影响程序正确性,务必牢记。好消息是原始类型很少,学习成本低;而且许多语言在这些细节上保持一致,例如遵循 IEEE 754 浮点标准。
非数值类型:值还可以代表声音、图像、地理位置、网址、网络连接等。部分可以直接用原始类型表示,如 bool 的 True 与 False;更多类型需要用本章将学到的“组合与抽象”自行定义。
接下来的小节会继续介绍 Python 的其他原始类型,并说明它们如何支撑数据抽象。想了解更全面的行为与示例,可参阅《Dive Into Python 3》的 原始数据类型 章节。