> For the complete documentation index, see [llms.txt](https://zlt-shadow.gitbook.io/sicp-in-python-cn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://zlt-shadow.gitbook.io/sicp-in-python-cn/di-2-zhang-shu-ju-gou-jian-chou-xiang/2.1-yin-yan.md).

# 2.1 引言

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

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

### 2.1.1 原生数据类型

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

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

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

1. 有些表达式的计算结果是原生类型的值，称为字面量。&#x20;
2. 有一些内置函数和操作符来操作原生类型的值。&#x20;

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浮点标准](http://en.wikipedia.org/wiki/IEEE_floating_point)等社区指南强制执行。&#x20;

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

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