数据抽象—基本数据类型和序列
Luckyjing 于 2020年11月22日 发表在 计算机程序与解释

基本数据类型

首先介绍基本数据类型,如何用基础数据对象来构建复合数据对象?

数据抽象:通过基本数据对象来构造复合数据对象,使得复合数据的使用与其数据详细实现相分离。 有效使用内置和用户定义的数据类型是数据处理应用程序的基础。

数值类型

Python中每一个值都对应一个class,它确定是什么类型。相同类型也有相同行为。

>>> type(2)
<class 'int'>
>>> type(1.5)
<class 'float'>
>>> type(1+1j)
<class 'complex'>
>>> 7 / 3 * 3
7.0
>>> 1 / 3 * 7 * 3
6.999999999999999

非数值类型

其他类型值,例如声音,图像,位置,网址以及网络连接等。一些本地数值类型,如布尔类值,"TRUE","FALSE"。大多数类型必须由程序员使用,通过本章介绍的组合和抽象方法定义。


数据抽象

当我们考虑要在程序中表示的世界上各种各样的事物时,我们发现其中大多数具有复合结构。例如,地理位置具有纬度和经度坐标。为了表示位置,我们希望编程语言能够将纬度和经度耦合在一起以形成一个对,即“复合数据”值,我们的程序可以将其作为单个概念单元进行操作,但是还具有两个部分, 可以单独考虑。

复合数据的使用使我们能够增加程序的模块化。如果我们可以将地理位置作为整体值来处理,那么我们可以屏蔽程序中使用位置进行计算的部分,从这些位置如何表示的细节中了解。将处理如何表示数据的程序各部分与处理数据如何处理的各部分隔离开的通用技术是一种功能强大的设计方法,称为数据抽象。数据抽象使程序更易于设计,维护和修改。

数据抽象在功能上类似于功能抽象。当我们创建功能抽象时,可以抑制如何实现功能的细节,并且可以用具有相同总体行为的任何其他功能替换特定功能本身。换句话说,我们可以进行抽象,将功能的使用方式与功能实现的细节分开。类似地,数据抽象将复合数据值的使用方式与构造方式的细节隔离开来。

数据抽象的基本思想是构造程序,以便它们对抽象数据进行操作。也就是说,我们的程序应该以这样的方式使用数据,以便对数据做出尽可能少的假设。同时,将具体的数据表示形式定义为程序的独立部分。

程序的这两个部分,即对抽象数据进行操作的部分,以及定义具体表示的部分,由一小组根据具体表示形式实现抽象数据的函数连接在一起。

复合值把其他值组合到一起,例如:

日期:年,月,日

地理位置:经度,维度

数据抽象使得我们操作复合数据作为一个单元,分离数据表示和数据操作。

例子: 分数

>>> 1/3
0.3333333333333333
>>> 1/3 == 0.333333333333333300000  # Dividing integers yields an approximation
True

以下代码实现分数和基本操作

image.png

抽象边界

我们根据构造函数“rational”,选择器“ numer”[分子]和“ denom”[分母]来定义操作。通常,数据抽象的基本思想是确定一组基本操作,据此将表达某种类型的值的所有操作,然后仅在处理数据时使用这些操作。通过以这种方式限制操作的使用,无需更改程序的行为即可更轻松地更改抽象数据的表示形式。

对于有理数,如表中所述,程序的不同部分使用不同的运算来操作有理数。

分数操作如下表所示

image.png

数据属性

抽象壁垒决定了我们思考数据的方式。有理数的有效表示形式不限于任何特定实现(例如,由两个元素组成的列表),通过rational返回,rational可以传递给"numer"和“ denom”。

通常,我们可以使用选择器和构造函数的集合以及某些行为条件来表示抽象数据。只要满足行为条件(例如上面的除法属性),选择器和构造函数便构成了一种数据的有效表示形式。抽象边界下的实现细节可能会更改,但是如果行为没有改变,则数据抽象将保持有效,并且使用此数据抽象编写的任何程序都将保持正确。

image.png

image.png

高阶函数的使用与我们对数据直觉无对应关系,但是这些函数足以标识我们程序中的数据对。函数足以表示复合数据。


序列

序列不是特定内置类型或抽象数据表示形式的实例,而是一系列在几种不同类型的数据之间共享的行为的集合。也就是说,有许多种序列,序列是计算机科学中强大,基础的抽象。但是它们都有共同的行为,特别是:

- 长度(length): 序列的长度是有限的。空序列的长度为0

- 元素选择(Element selection):序列中的一个元素对应于任何小于其长度的非负整数索引,从第一个元素的0开始。

Python包含几种本地数据类型,其中最主要的是列表("list")。

image.png

序列迭代

需要迭代序列中的所有元素,并对每个返回的元素执行某种操作。在Python中可以使用for循环来处理。

image.png

简化函数体为:

image.png

序列遍历

程序中常见的一种模式是序列元素本身也是序列,但是这些元素都是固定长度的。for语句头可以包含多个名称来"遍历”每个元素序列至其特定的元素。例如2个列表元素的列表:

image.png

将多个名称绑定到固定长度序列中的多个值的这种模式称为“序列遍历”;这与我们在将多个名称绑定到多个值的赋值语句中看到的模式相同。

Range函数

image.png

就解释器而言,此下划线"_"只是环境中的另一个名称,但是在程序员中具有常规含义,该含义表明该名称不会出现在任何将来的表达式中。

序列处理

序列是复合数据的一种常见形式,因此整个程序通常围绕这种单一抽象进行组织。 具有序列作为输入和输出的模块化组件可以混合并匹配以执行数据处理。 复杂的组件可以通过将序列处理操作的流水线链接在一起来定义,每个处理过程都很简单且专注。

列表推导

通过评估序列中每个元素的固定表达式并在结果序列中收集结果值,可以表示许多序列处理操作。 在Python中,列表推导是执行这种计算的表达式。

image.png

列表汇总

序列处理中的第三种常见模式是将序列中的所有值聚合为单个值。内置函数“ sum”,“ min”和“ max”都是聚合函数的示例。通过组合评估每个元素的表达式的模式,选择元素的子集并聚合元素,我们可以使用序列处理方法解决问题。

image.png

image.png

注意:本站所有文章除特别说明外,均为原创,转载请务必以超链接方式并注明作者出处。 标签:python,基本数据类型,序列,数据抽象,抽象边界,列表推导