计算机视觉40例从入门到深度学习(OpenCV-Python)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.3 数据类型

Python提供了多种不同的数据类型来处理数据。之所以提供不同的数据类型,是基于如下两方面的考虑。

1.存储空间的角度

例如,在图2-2中,如果将空间统一划分为如图2-2(a)所示的较小单位,虽然能够存储更多数据,但是较小的空间不能存储较大的数据。如果将所有空间都划分为如图2-2(b)所示的较大单位,虽然能够存储较大的数据,但存储的数据量会变得很少。如果将空间划分为如图2-2(c)所示的大小不一的单位,那么既能够存储大小不等的数据,又有足够多的空间单元来存储数据。

这和我们在生活中使用大小不一的盒子来存储物品的道理是一样的。

图2-2 存储空间需求

2.不同运算的需求

在数据处理过程中,针对不同数据类型会有不同的需求。例如,图2-3中的两个数字“5”和“3”:

● 当它们是字符时,我们希望将它们连接起来,得到“53”。

● 当它们是数值时,我们希望计算它们的和,得到“8”。

图2-3 运算示例

不同的数据类型,决定了我们想要得到的结果。这和我们在生活中使用不同的厨具来处理不同食材的道理是一样的。

2.3.1 基础类型

本节将介绍整型、浮点型、布尔型、字符串这几种数据类型。

1.整型

整型就是数学中的整数,如9、666、-3等。直接使用:

完成定义即可。例如:

上述程序定义了一个整型变量price,其值为108。

2.浮点型

浮点型就是小数,即带有小数点的数字,如3.14、2.718281828459、0.618等。例如:

上述程序定义了一个浮点数price,其值为99.99。

3.布尔型

由于布尔(George Boole,1815-1864)在逻辑运算领域做出了特殊贡献,因此常将逻辑运算(Logical Operators)称为布尔运算,将其结果称为布尔值。逻辑运算通常用来测试真假值,其结果要么是“真”,要么是“假”。也就是说,布尔型的数据仅包含“True”和“False”两个数据。

例如,逻辑表达式:

的结果为“True”。

逻辑表达式:

的结果为“False”。

4.字符串

字符串表示一串文本内容,在定义时通常使用“双引号”或“单引号”来完成。例如:

上述程序中,分别定义了字符串a和字符串b,字符串c是将字符串a和字符串b连接的结果,得到的是“李立宗Python课程”。最后将c输出,输出的是字符串c的内容。

2.3.2 列表

列表(List)是数据的集合,可以将用到的一组数据集中存储在一个列表中。例如,需要存储100个成绩数据时,不需要单独定义100个整型变量,而是定义一个列表,将所有成绩都存放在这个列表中即可。

1.定义

在定义列表时,使用中括号将所有值括起来,并将不同的值使用逗号分隔开。

【例2.2】列表的定义及输出。

本例定义了两个列表,分别是列表a和列表b,并将它们输出。

上述程序输出结果为

2.访问

可以使用索引来访问列表内的元素,索引表示的是位置信息。可以使用正索引和负索引两种不同形式来访问列表内的元素。索引信息示意图如图2-4所示。

图2-4 索引信息示意图

【例2.3】使用索引访问列表元素。

上述程序输出结果为

Python提供了使用冒号“:”实现切片功能,其一般语法格式为

需要注意的是,上述形式表示的区间是左闭右开的。也就是说,冒号指定的切片区间包含起始索引对应的元素,不包含终止索引对应的元素。例如,有列表“a=[5,8,7,3,9,6,1,0,2]”,则“a[2:6]”表示的是a[2]、a[3]、a[4]、a[5]四个元素,分别是列表a中的7、3、9、6,不包含“a[6]”对应的元素“1”。

在必要时,可以使用“步长”来表示在索引元素时使用的步长,其语法格式为

例如,“a[2:9:2]”表示步长为2,表示的值为a[2]、a[4]、a[6]、a[8]四个元素。

除此之外,起始索引、终止索引都可以根据需要省略。

● 如果想从第0个元素开始索引,那么可以将起始索引省略,仅仅用一个终止索引,如“a[:6]”与“a[0:6]”是一致的。此时,相当于省略了开始索引0。

● 如果想索引到最后一个元素,那么可以将终止索引省略,仅仅用一个起始索引,如“a[6:]”表示的是从第7个元素开始索引直到最后一个元素。此时,相当于省略了终止索引位置上的列表长度值(结束位置索引加1的结果)。

【例2.4】使用切片访问列表元素。

上述程序输出结果为

【注意】在Python中,正索引的起始索引从0开始,负索引的起始索引从-1开始。另外,索引中的“[开始,结束]”是“左闭右开”的形式,终止索引对应的元素并不包含在索引结果中。

3.添加

可以使用函数append向列表的末尾添加元素。例如,使用“a.append(666)”可将数值666添加到列表a的末尾。

【例2.5】使用函数append向列表内添加元素。

上述程序输出结果为

4.删除

使用del可以删除列表内指定索引对应的元素。例如,使用“del a[2]”会将列表a内索引2对应的元素删除。

【例2.6】使用del删除列表元素。

上述程序输出结果为

2.3.3 元组

元组(Tuple)在使用上与列表类似,使用圆括号将其中的元素括起来,各元素间使用逗号分隔。需要特别注意的是,元组元素是不能改变的。

【例2.7】使用切片访问元组元素。

上述程序中的“#”是注释标记,该标记后面的内容是注释内容,不会被Python执行。如果去掉注释,尝试执行“a[2]=666”,那么程序会报错。上述程输出结果为

Python提供了很多处理列表、元组的方法,下面通过【例2.8】来进行简单说明。

【例2.8】数据处理。

上述程序输出结果为

上述程序中,各个语句含义如下。

● c=a+b:表示将元组a和元组b连接到一起,并赋值给c。

● l=len(c):函数len用来计算参数c的长度。

● d=a*3:元组的乘号“*”运算,表示将元组迭代指定的次数,该语句表示将元组a迭代3次。

上述运算,同样适用于列表。

【注意】在Python中:

● 定义列表时使用的是方括号;定义元组时使用的是圆括号。

● 列表的大小是可变的(可以删除、添加元素)、元素值是可修改的;元组的大小、元素值都是固定的,是不能修改的。

2.3.4 字典

列表只能存储单一的信息。例如,在存储一组成绩时,列表只能存储成绩,不能同时存储成绩及对应人名。要想使用列表同时存储人名、成绩,必须构建两个列表,并确定两个列表间的对应关系。很显然这样做的效率不高,而且容易出错。

字典(Dict)是相关数据对的一个集合,这个数据对通常被称为键值对。它和日常生活中使用的字典类似,能够轻松地通过字(键,key),找到对应的解释说明(值,value)。它能够同时存储成绩及对应的人名,并能够通过人名(键)查找到对应的成绩(值)。字典示例如表2-1所示。

表2-1 字典示例

1.使用基础

在创建字典时,键和值之间使用冒号分隔,相邻的两个键值对之间使用逗号分隔,所有元素放在“{}”中。例如,“a={"李立宗":66,"刘能":88,"赵四":99}”语句创建了一个字典a。

与列表、元组等不同的是,在引用时字典中的元素时不再使用索引,而是使用键。例如,通过“a["李立宗"]”可以获取字典a中的键李立宗对应的值66。

【例2.9】字典使用基础。

上述程序输出结果为

2.改增删

改增删(修改、增加、删除)是在数据处理中最常用的操作,在字典中执行上述操作的方式如下:

● 修改:针对已经存在的键,使用“字典名[键]=新值”的语法形式完成键值对的删除。例如,“a["李立宗"]=90”语句会将字典中键李立宗对应的值修改为90。

● 增加:使用“字典名[键]=值”的语法形式完成。例如,执行“a[‘小明’]=100”语句可向字典a中新增一个键值对“小明:100”。

● 删除:使用“del字典名[键]”语法形式完成键值对的删除。例如,执行“del a['李立宗']”语句将会删除字典a中键李立宗对应的键值对。

【例2.10】字典的数据处理。

上述程序输出结果为