Skip to content

2.1 引言 ​

INFO

来源:2.1 Introduction

第一章讲的是计算过程(computational processes),以及函数在程序设计中的作用。我们看到了如何使用基本数据(数字)和基本操作(算术运算),如何用组合和控制搭出复合函数,如何给过程命名来创建函数抽象。我们还看到,高阶函数让我们能操作、进而推理通用的计算方法,从而增强了语言的威力。这很大程度上就是编程的精髓。

本章把重点转向数据。这里探讨的技术,能让我们表示和处理众多不同领域的信息。互联网的爆发式增长,让海量结构化信息人人都能在网上自由获取,计算也能应用到范围极广的各种问题上。有效利用内置和用户自定义的数据类型,是数据处理应用的基础。

2.1.1 原生数据类型 ​

Python 中的每个值都有一个类(class),它决定了这个值是什么类型。同属一个类的值,行为也相同。例如,整数 1 和 2 都是 int 类的实例(instance)。这两个值可以同等对待,比如都能取反,也都能和另一个整数相加。内置的 type 函数可以查看任何值的类。

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

到目前为止,我们用到的值都属于 Python 语言内置的少数几种原生数据类型(native data types)。原生数据类型有以下特性:

  • 存在求值为原生类型值的表达式,称为字面值(literal)
  • 存在操作原生类型值的内置函数和运算符

int 类是表示整数的原生数据类型。整数字面值(相邻数字组成的序列)求值为 int 值,数学运算符负责处理这些值。

py
>>> 12 + 3000000000000000000000000
3000000000000000000000012

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

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

浮点数(Floats):float 这个名字,来自 Python 和许多其他编程语言表示实数的方式——「浮点」表示法。数字在底层如何表示,不在本书的讨论范围,但 int 和 float 对象之间有些高层次的差异必须了解。具体来说,int 对象能精确表示整数,对大小也没有限制。而 float 对象能表示范围很广的分数,但并非所有数字都能精确表示,而且有最小值和最大值的限制。所以,float 值应当看作实数的近似值,这些近似值只有有限的精度。把多个 float 值组合起来,可能产生近似误差;下面两个表达式要不是有近似误差,本该都求值为 7。

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

上面参与运算的虽然是 int 值,但一个 int 除以另一个 int,得到的是 float 值:两个整数相除所得实际比值的一个截断后的有限近似值。

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

做相等性测试时,这种近似带来的问题就会暴露出来。

py
>>> 1/3 == 0.333333333333333312345  # 警惕浮点数近似误差
True

int 和 float 这两个类之间的细微差别,对写程序影响很大,所以程序员必须牢记这些细节。好在原生数据类型屈指可数,要熟练掌握一门编程语言,需要死记硬背的东西并不多。而且,有了 IEEE 754 浮点数标准 这类社区准则的强制规定,这些细节在许多编程语言里都是一致的。

非数值类型(Non-numeric types)。值还能表示许多其他类型的数据,例如声音、图像、位置、网址、网络连接等等。其中有少数由原生数据类型表示,比如用 bool 类表示 True 和 False。大多数值的类型,必须由程序员用本章将要介绍的组合和抽象手段自己定义。

接下来的章节会介绍更多 Python 的原生数据类型,重点关注它们对创建有用的数据抽象有什么用。想了解更多细节的话,在线书籍《Dive Into Python 3》里有一章讲 原生数据类型,对 Python 所有的原生数据类型及其操作方法做了实用的概览,还附有大量用法示例和实用技巧。

基于 MIT 许可发布