Skip to content

2.1 引言

INFO

译者:mancuojclcs

来源:2.1 Introduction

在第一章中,我们将重点放在了计算过程(computational processes)以及函数在程序设计中的作用上。我们学习了如何使用基本数据(数字)和基本操作(算术运算),如何通过组合与控制流程来构建复合函数,以及如何通过给过程命名来创建函数抽象。我们还看到,高阶函数通过允许我们操作(进而推导)通用的计算方法,增强了语言的威力。这就是编程的精髓所在。

本章将聚焦于数据。我们要探讨的技术将使我们能够表示和处理众多不同领域的信息。得益于互联网的爆发式增长,我们可以轻松在线获取海量的结构化信息,计算技术也可以应用于范围极广的各类问题中。有效利用内置和用户定义的数据类型,是数据处理应用的基础。

2.1.1 原生数据类型

Python 中的每个值都有一个(class),用于决定该值的数据类型。属于同一个类的值,其行为模式也是相同的。例如,整数 12 都是 int 类(整数类)的实例(instances)。这两个值可以被同等对待,例如,它们都可以被取反,或者与另一个整数相加。利用内置的 type 函数,我们可以查看任何值的所属类。

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

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

  • 存在能直接求值为原生类型值的表达式,称为字面量(literals)
  • 存在用于操作原生类型值的内置函数和运算符

int 类是用于表示整数的原生数据类型。整数字面量(由连续数字组成的序列)求值后会得到 int 值,数学运算符可以对这些值进行操作。

py
>>> 12 + 3000000000000000000000000
3000000000000000000000012

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

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

浮点数(Floats):float 这个名字源于 Python 及许多其他编程语言表示实数的方式:即“浮点”表示法。虽然数字如何在底层表示并非本书讨论的话题,但了解 intfloat 对象之间的一些高层级差异至关重要。特别是,int 对象能精确地表示整数,且对其大小没有限制(只要内存允许)。

反之,float 对象虽然可以表示范围极广的分数,但并非所有数字都能被精确表示,且存在最大值和最小值的限制。因此,应将 float 值视为实数的近似值。这些近似值的精度是有限的。组合使用 float 值可能会导致近似误差;若非因为近似误差,下面两个表达式的结果本该都是 7。

译注:不同于其他的编程语言,Python3 中的 int 值是无界的,也就是说它可以存储任意大小的数,具体可以查看 PEP 237

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

intfloat 之间这些细微的差别会对编写程序产生广泛的影响,因此程序员必须牢记这些细节。好在原生数据类型屈指可数,要熟练掌握一门编程语言,所需死记硬背的内容并不多。此外,得益于 IEEE 754 浮点数标准 等社区准则的强制规定,这些细节在许多编程语言中都是一致的。

非数值类型(Non-numeric types)。值还可以表示许多其他类型的数据,例如声音、图像、位置、网址、网络连接等等。其中少数由原生数据类型表示,例如用于表示 TrueFalsebool 类。大多数值的数据类型必须由程序员使用我们将在本章开发的组合和抽象手段来自行定义。

接下来的章节将介绍更多 Python 的原生数据类型,重点关注它们在创建有用的数据抽象时所扮演的角色。如果想要了解更多细节,在线书籍《Dive Into Python 3》中关于 原生数据类型 的章节提供了一个实用的概览,涵盖了 Python 所有的原生数据类型及其操作方法,并附有大量使用示例和实用技巧。

基于 MIT 许可发布