![计算机视觉40例从入门到深度学习(OpenCV-Python)](https://wfqqreader-1252317822.image.myqcloud.com/cover/633/47379633/b_47379633.jpg)
2.3 数据类型
Python提供了多种不同的数据类型来处理数据。之所以提供不同的数据类型,是基于如下两方面的考虑。
1.存储空间的角度
例如,在图2-2中,如果将空间统一划分为如图2-2(a)所示的较小单位,虽然能够存储更多数据,但是较小的空间不能存储较大的数据。如果将所有空间都划分为如图2-2(b)所示的较大单位,虽然能够存储较大的数据,但存储的数据量会变得很少。如果将空间划分为如图2-2(c)所示的大小不一的单位,那么既能够存储大小不等的数据,又有足够多的空间单元来存储数据。
这和我们在生活中使用大小不一的盒子来存储物品的道理是一样的。
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_41_2.jpg?sign=1739288043-Qq5WHXFP1XYTLB0dYkOhLP6Ikjspzd2d-0-75eb09a506e214abbe5e735276c80e81)
图2-2 存储空间需求
2.不同运算的需求
在数据处理过程中,针对不同数据类型会有不同的需求。例如,图2-3中的两个数字“5”和“3”:
● 当它们是字符时,我们希望将它们连接起来,得到“53”。
● 当它们是数值时,我们希望计算它们的和,得到“8”。
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_41_3.jpg?sign=1739288043-y1tOaLiFYbLkyhzdU9B95zJqSJ08CDOH-0-fe1852cfb2bb53ad0178943ba12847f1)
图2-3 运算示例
不同的数据类型,决定了我们想要得到的结果。这和我们在生活中使用不同的厨具来处理不同食材的道理是一样的。
2.3.1 基础类型
本节将介绍整型、浮点型、布尔型、字符串这几种数据类型。
1.整型
整型就是数学中的整数,如9、666、-3等。直接使用:
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_42_1.jpg?sign=1739288043-7jKVUJHFcdYSJDH7ibaXYFDz45Yd6AUP-0-b9686017a5a5049146bf383cd2448971)
完成定义即可。例如:
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_42_2.jpg?sign=1739288043-M2UDADfBzpPKdTQihA0bP4pkajYHSJOW-0-7b93acbd74a7c1a742cec7e230deebd1)
上述程序定义了一个整型变量price,其值为108。
2.浮点型
浮点型就是小数,即带有小数点的数字,如3.14、2.718281828459、0.618等。例如:
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_42_3.jpg?sign=1739288043-a4ZSFkF0chVqMbX81bEV3u4DeeekvS3B-0-6ffae37629bc90445d69878fef6f6cda)
上述程序定义了一个浮点数price,其值为99.99。
3.布尔型
由于布尔(George Boole,1815-1864)在逻辑运算领域做出了特殊贡献,因此常将逻辑运算(Logical Operators)称为布尔运算,将其结果称为布尔值。逻辑运算通常用来测试真假值,其结果要么是“真”,要么是“假”。也就是说,布尔型的数据仅包含“True”和“False”两个数据。
例如,逻辑表达式:
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_42_4.jpg?sign=1739288043-yYJR4zlLMParWErXs0oQUIXKIM6Act3Y-0-60013295155f78729dd08e78f235f109)
的结果为“True”。
逻辑表达式:
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_42_5.jpg?sign=1739288043-MY05HMcIfvvFt5lOWYl9vq7XFZOCeayV-0-2742e2be6c887e5a286983bd3e2b2e64)
的结果为“False”。
4.字符串
字符串表示一串文本内容,在定义时通常使用“双引号”或“单引号”来完成。例如:
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_42_6.jpg?sign=1739288043-qbvqkD0E0GrAAuSqoHBuysJYFExm6vVg-0-da61979228464c86383ea9053c57afd1)
上述程序中,分别定义了字符串a和字符串b,字符串c是将字符串a和字符串b连接的结果,得到的是“李立宗Python课程”。最后将c输出,输出的是字符串c的内容。
2.3.2 列表
列表(List)是数据的集合,可以将用到的一组数据集中存储在一个列表中。例如,需要存储100个成绩数据时,不需要单独定义100个整型变量,而是定义一个列表,将所有成绩都存放在这个列表中即可。
1.定义
在定义列表时,使用中括号将所有值括起来,并将不同的值使用逗号分隔开。
【例2.2】列表的定义及输出。
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_43_1.jpg?sign=1739288043-PpHGtS8yeZhwMZrSk8I5WILQaNxgznvn-0-b4f80e600cae8155a5e2f9e8e915beaf)
本例定义了两个列表,分别是列表a和列表b,并将它们输出。
上述程序输出结果为
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_43_2.jpg?sign=1739288043-6kFSJLwH5Pj6W2fWvn6pldJEHTq8aUjg-0-35d37a188b917f3b64d1caea0972c614)
2.访问
可以使用索引来访问列表内的元素,索引表示的是位置信息。可以使用正索引和负索引两种不同形式来访问列表内的元素。索引信息示意图如图2-4所示。
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_43_3.jpg?sign=1739288043-qNNdmhPEUR2oTv2AT0hcVJP4lW5AdMHk-0-402dca2524b660b74ba60f22f9c22b80)
图2-4 索引信息示意图
【例2.3】使用索引访问列表元素。
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_43_4.jpg?sign=1739288043-aDVvK8DpCJKBXIXiJE79XIDTZqIdr4uC-0-28657561d50df01aa6ce74a67eec019b)
上述程序输出结果为
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_43_5.jpg?sign=1739288043-vDIgNdI6vPPPaZyo04YBiLOih7GsDeMG-0-a2a574467d80981ca51030aa530a3cd6)
Python提供了使用冒号“:”实现切片功能,其一般语法格式为
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_43_6.jpg?sign=1739288043-Acj2KPNddyHsUGb3n2UHdlFXdcC5QgRy-0-b2a26f1bf869663cbba3fcec7a9cf472)
需要注意的是,上述形式表示的区间是左闭右开的。也就是说,冒号指定的切片区间包含起始索引对应的元素,不包含终止索引对应的元素。例如,有列表“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”。
在必要时,可以使用“步长”来表示在索引元素时使用的步长,其语法格式为
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_44_1.jpg?sign=1739288043-WpZtGW6lDcKmOn0ky103lcAiPWi8QsA1-0-d1fa2971bf27c8e914a890adbca9225e)
例如,“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】使用切片访问列表元素。
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_44_2.jpg?sign=1739288043-q2vOX3tUZjEDUoF0gMMtM8GjOcZiM6cM-0-f68d820b173b42bc13c66311fec97cc4)
上述程序输出结果为
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_44_3.jpg?sign=1739288043-d8BDtE60lwappPoYPQcU8yxIq7hVuATV-0-f4f1be3d2cec7c849fc7b60307b5a510)
【注意】在Python中,正索引的起始索引从0开始,负索引的起始索引从-1开始。另外,索引中的“[开始,结束]”是“左闭右开”的形式,终止索引对应的元素并不包含在索引结果中。
3.添加
可以使用函数append向列表的末尾添加元素。例如,使用“a.append(666)”可将数值666添加到列表a的末尾。
【例2.5】使用函数append向列表内添加元素。
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_44_4.jpg?sign=1739288043-XhrvjHbTOuyzyR5aYb3mJ9Nh3I3rObDI-0-1d0154916e008940d195668257b74edb)
上述程序输出结果为
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_44_5.jpg?sign=1739288043-C6WgKNeRAG8UCYCfYuRyyIv2H0C9j9Nm-0-3920ebfdf3d6a6d04101036c5693fb69)
4.删除
使用del可以删除列表内指定索引对应的元素。例如,使用“del a[2]”会将列表a内索引2对应的元素删除。
【例2.6】使用del删除列表元素。
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_45_1.jpg?sign=1739288043-NrdAMP7Oc6w284YrnkJW3zgN3rceNwj4-0-49f06bc05e3c5d13bb85a1bc7b74c2e1)
上述程序输出结果为
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_45_2.jpg?sign=1739288043-N0NPOpnLFHdZZyzdvX4qOANaLSh1HHQQ-0-c111cc94177a1e09d4fd3d346f6467ca)
2.3.3 元组
元组(Tuple)在使用上与列表类似,使用圆括号将其中的元素括起来,各元素间使用逗号分隔。需要特别注意的是,元组元素是不能改变的。
【例2.7】使用切片访问元组元素。
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_45_3.jpg?sign=1739288043-dr8G7TZrTY8cTjxbKstr4U3W4gkasL3R-0-9e8554d49106034152b74e1fed238059)
上述程序中的“#”是注释标记,该标记后面的内容是注释内容,不会被Python执行。如果去掉注释,尝试执行“a[2]=666”,那么程序会报错。上述程输出结果为
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_45_4.jpg?sign=1739288043-9EpQugX1C75IIfrwL5E678tsL2TIunP2-0-ac0d79f594df3ab2b3584b1d5d22d201)
Python提供了很多处理列表、元组的方法,下面通过【例2.8】来进行简单说明。
【例2.8】数据处理。
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_45_5.jpg?sign=1739288043-jVkibnwUYpWw8WJaiyxzZGOsf7biAzAP-0-746e3a5b09ce2e0d526cf7c97d9c9ad5)
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_46_1.jpg?sign=1739288043-mazDj2mjnQvchrX8JRA9KVMAztzrTuaQ-0-65f462c1e046b28460313c7dd512f072)
上述程序输出结果为
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_46_2.jpg?sign=1739288043-qXRznmFzVWppqoEsmZW4JSvyOhqGoNdH-0-b42f65b3600e5e1cc7b68a9eec0ca27e)
上述程序中,各个语句含义如下。
● 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 字典示例
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_46_3.jpg?sign=1739288043-MUOSchoiwTLLVgbkV4rCc1wD2SYqaUO0-0-813489a85f3bbb7043271aa580266f17)
1.使用基础
在创建字典时,键和值之间使用冒号分隔,相邻的两个键值对之间使用逗号分隔,所有元素放在“{}”中。例如,“a={"李立宗":66,"刘能":88,"赵四":99}”语句创建了一个字典a。
与列表、元组等不同的是,在引用时字典中的元素时不再使用索引,而是使用键。例如,通过“a["李立宗"]”可以获取字典a中的键李立宗对应的值66。
【例2.9】字典使用基础。
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_47_1.jpg?sign=1739288043-RHQE4yT2iNZyB1LKBTWeZGOqLI4RNwr8-0-5d2cadf5a9b14758daa2c2ddfc97e1e8)
上述程序输出结果为
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_47_2.jpg?sign=1739288043-AKA7R0FJy4AcYhun8Gt9hvYSJcTuudUH-0-c466776fab9dda3cd2af63a4ef12405d)
2.改增删
改增删(修改、增加、删除)是在数据处理中最常用的操作,在字典中执行上述操作的方式如下:
● 修改:针对已经存在的键,使用“字典名[键]=新值”的语法形式完成键值对的删除。例如,“a["李立宗"]=90”语句会将字典中键李立宗对应的值修改为90。
● 增加:使用“字典名[键]=值”的语法形式完成。例如,执行“a[‘小明’]=100”语句可向字典a中新增一个键值对“小明:100”。
● 删除:使用“del字典名[键]”语法形式完成键值对的删除。例如,执行“del a['李立宗']”语句将会删除字典a中键李立宗对应的键值对。
【例2.10】字典的数据处理。
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_47_3.jpg?sign=1739288043-DC2IQ0KL9MK6ShImRNhIjgYasha6NbJp-0-cfb6558bc5c4fd65b32f25a2ad6dc842)
上述程序输出结果为
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_47_4.jpg?sign=1739288043-IjrsMsSBGiLDNMPWsY2YKX4vmV713umq-0-83fe86fb3cb71803a905bec4e6b644b4)
![](https://epubservercos.yuewen.com/F17EC3/26763881209488706/epubprivate/OEBPS/Images/43685_48_1.jpg?sign=1739288043-BSm2mzuZgotfVUbRI0v5zpVO8BXlpca2-0-969ca7cbc5be392144176319cb06bb86)