Python数据结构学习笔记
上QQ阅读APP看书,第一时间看更新

1.3 数据类型和抽象数据类型

在1.1.3节中曾经简要说明了数据类型和抽象数据类型的概念,提到过抽象数据类型是数据类型中的一种。在现实应用中,基于数据类型的重要性,在本节单独讲解这个概念的相关知识。

↑扫码看视频(本节视频课程时间:3分21秒)

1.3.1 数据类型

很多初学者可能会问,数据类型的内容苦涩难懂,为什么有这么多的数据类型,难道不能只用一种数据类型吗?编程语言之所以推出这么多的数据类型,这需要从生活中常见的类型分类说起。例如在麦当劳餐厅中,菜单设计十分人性化,套餐被放在置顶区域,而汉堡、烤翅等单品系列也被分类放在一个区域。这样分类的目的是让消费者快速完成点餐,特别是套餐指定的设计更是符合销售要求。并且将各类单品集中放置,起到一个很好的对比作用。例如在肉类单品位置,麦乐鸡紧挨着麦乐鸡翅和香骨鸡腿,这样消费者在点餐时可以很好地进行对比。

再次回到计算机编程语言中,先看看为什么会有不同的数据类型呢?很简单,很多东西不能一概而论,而是需要更精确的划分。计算机计算1+1并不需要多么大的空间,但是计算10000000000+1000000000就得需要有个比较大的空间来放。有时候还会计算小数,小数的位数不一样,需要的空间也就不一样。数字1和字母a也需要区分,于是开发者就想出了“数据类型”这一招,用来描述不同的数据的集合。笔者最早接触的数据类型是int,依稀记得当初一个“int a;”就把我看得不知所以。像int、double、float之类的类型,就是一个基本的数据类型。数据类型的专业解释是,一个值的集合和定义在这个值集合的一组操作的总称。一种数据类型也可以看成是一种已经实现了的“数据结构”。

按照“值”是否可以被分解,可以将类型分为以下两类。

(1)原子类型:表示其值不可分解,通常由语言直接提供,例如编程语言中的int、float、double等都是原子类型。

(2)结构类型:是指其值可以分解为若干部分(分量),是程序员自定义的类型,比如结构体、类等都是结构类型。

1.3.2 抽象数据类型

抽象数据类型(Abstract Data Type,ADT)只是一个数学模型以及定义在模型上的一组操作。通常是对数据的抽象,定义了数据的取值范围以及对数据操作的集合。其实在大多数情况下,可以将数据类型和抽象数据类型看成是一种概念。比如,各种计算机都拥有的整数类型就是一个抽象数据类型,尽管实现方法不同,但它们的数学特性相同。抽象数据类型的特征是实现与操作分离,从而实现封装。例如,在统计学生信息时,经常使用姓名、学号、成绩等信息,我们可以定义这样的一个抽象数据类型student,它封装了姓名、学号、成绩三个不同类型的变量,这样操作student的变量就能很方便地知道这些信息了。C语言中的结构体以及Python、C++、Java语言中的类等都是这种形式。

在网络中看到网络高手用“超级玛丽”为例来说明抽象数据类型的含义,通俗易懂,便于理解。“超级玛丽”是一款经典的任天堂游戏,游戏主角是马里奥,我们给他定义了几个基本操作,前进、后退、跳、打子弹等。这几个操作就是一个抽象数据类型,定义了一个数据对象、对象中各元素之间的关系及对数据元素的操作。至于到底是哪些操作,这只能由开发者根据实际需要来决定。在开发马里奥游戏的初期,可能只能走和跳两个动。后来随着游戏的升级,发现应该增加一种打子弹的操作,再后来又有了按住打子弹键后前进就有跑的操作。这都是根据实际情况来定的。事实上,抽象数据类型体现了程序设计中问题分解和信息隐藏的特征。抽象数据类型把问题分解为多个规模较小且容易处理的问题,然后把每个功能模块的实现为一个独立单元,通过一次或多次调用来实现整个问题。