2.1 引言

我们在第一章集中讨论了计算过程和函数在程序设计中的作用。 我们了解了如何使用原始数据(数字)和原始操作(算术),如何通过组合和控制来形成复合函数,以及如何通过给过程命名来创建函数抽象。 我们还发现,高阶函数增强了语言的能力,使我们能够根据通用的计算方法进行操作,从而进行推理。 这就是编程的精髓所在。

本章的重点是数据。 我们在这里研究的技术将允许我们表示和操作许多不同领域的信息。 由于互联网的爆炸式增长,我们所有人都可以在网上免费获得大量的结构化信息,计算可以应用于各种各样的不同问题。 有效使用内置和用户定义的数据类型是数据处理应用程序的基础。

2.1.1 原生数据类型

Python中的每个值都有一个类来决定它是什么类型的值。共享类的值也共享行为。例如,整数1和2都是int类的实例。这两个值可以进行类似的处理。例如,它们都可以被求反或添加到另一个整数。内置的type函数允许我们检查包含任何值的类。

>>> type(2)
<class 'int'>

到目前为止,我们使用的值都是Python语言中内置的少数原生数据类型的实例。原生数据类型具有以下属性:

  1. 有些表达式的计算结果是原生类型的值,称为字面量。

  2. 有一些内置函数和操作符来操作原生类型的值。

int类是用来表示整数的原生数据类型。整型字面值(相邻数字序列)计算为整型值,数学运算符操作这些值。

>>> 12 + 3000000000000000000000000
3000000000000000000000012

Python包含三种原生数字类型:整数(int)、浮点数(float)和复数(complex)。

>>> type(1.5)
<class 'float'>
>>> type(1+1j)
<class 'complex'>

浮点数。 float这个名字来自于Python和许多其他编程语言中实数的表示方式:“浮点”表示。 虽然数字如何表示的细节不是本文的主题,但了解int和float对象之间的一些高级区别是很重要的。 特别是,int对象精确地表示整数,没有任何近似值或对其大小的限制。 另一方面,浮动对象可以表示范围很广的小数,但并不是所有的数字都可以精确地表示,有最小值和最大值。 因此,浮点数应该被看作是实数的近似值。 这些近似的精确度是有限的。 组合浮点值会导致近似误差; 如果不是为了近似,下面的两个表达式都将计算为7。

>>> 7 / 3 * 3
7.0
>>> 1 / 3 * 7 * 3
6.999999999999999

虽然上面合并了整型值,但一个整型除以另一个整型会得到一个浮点值:两个整型除以的实际比率的截断有限近似值。

>>> type(1/3)
<class 'float'>
>>> 1/3
0.3333333333333333

当我们进行等式检验时,这种近似的问题就出现了。

>>> 1/3 == 0.333333333333333312345  # Beware of float approximation
True

int和float类之间的这些细微差别对编写程序有广泛的影响,因此程序员必须记住这些细节。 幸运的是,只有少数几种本机数据类型,这就限制了精通一门编程语言所需的记忆量。 此外,这些相同的细节在许多编程语言中都是一致的,由IEEE 754浮点标准等社区指南强制执行。

非数字类型。 值可以表示许多其他类型的数据,比如声音、图像、位置、web地址、网络连接等等。 少数是用本地数据类型表示的,例如bool类用于值True和False。 大多数值的类型必须由程序员使用,我们将在本章中开发的组合和抽象方法来定义。

下面几节将更多地介绍Python的原生数据类型,重点介绍它们在创建有用的数据抽象中所扮演的角色。 对于那些对进一步细节感兴趣的人,在线书籍Dive Into Python 3中关于原生数据类型的一章给出了所有Python原生数据类型以及如何操作它们的实用概述,包括大量的使用示例和实用技巧。

Last updated

Was this helpful?