摘要:
元组是不可变的序列类型,可以包含不同类型的元素。命名元组是元组的子类,它允许你为元组中的位置指定名称,从而使代码更加清晰,本文主要介绍了两种元组的使用方法和应用场景。
文档和代码获取:
本文档主要介绍如何使用 Python 进行 面向对象编程 ,需要读者对 Python 语法和 单片机 开发具有基本了解。相比其他讲解 Python 面向对象编程的博客或书籍而言,本文档更加详细、侧重于嵌入式 上位机 应用,以上位机和 下位机 的常见 串口 数据收发、数据处理、动态图绘制等为应用实例,同时使用 Sourcetrail代码软件对代码进行可视化阅读便于读者理解。
正文
元组
元组是一种可以 按照顺序存储一定数量其他对象的对象。 它们是不可变的,也就是说 在运行过程中我们不能添加、移除或替换其中的对象。 元组类型不可变性的最大好处在于,可以将其用作字典类型的键,以及用在其他要求对象拥有哈希值的地方。
元组 是用于存储数据的,不能存储行为。 如果需要某个行为来操纵元组,必须将元组传递给函数(或者其他对象的方法)来执行这一操作。
通常来说, 元组 应该存储彼此不同的值 ,例如,可能不会将3个传感器的ID号放到一个元组中,而是将传感器ID号、当前传感器采集的数值、传感器采集的最高值和最低值放到一个元组中。 元组的主要目的在于,将不同数据整合到一个容器中。因此,元组是用来替换“没有数据的对象”最简单的工具。
我们可以用以逗号分隔的值来创建一个元组,通常会使用括号,这样更方便阅读,也可以和其他语句区分开来,但这并不是强制的。
# 下面两种赋值语法是相同的(记录一个传感器的ID号、数据当前值、最高值与最低值):sensor_tuple = ("16",32,62,2)print(sensor_tuple, type(sensor_tuple))sensor_tuple = "16",32,62,2print(sensor_tuple, type(sensor_tuple))
如果在其他对象内部使用元组,如函数调用、列表推导或生成器,则括号是必需的。否则,解释器就没办法知道这是一个元组还是下一个函数参数。同时,在接收函数返回值时,会发生元组解包,即函数返回数据时,往往将变量组合到一起来进行简单的存储传递,在接收接收函数返回值时可以将其分解为多个不同的变量。
命名元组
由于对元组元素的访问需通过索引来完成,当使用元组中元素过多时,往往会混淆每个下标对应的具体含义。同时,在给另一个开发者写他所需要的函数时,另一位开发者很可能由于接收返回值顺序出错或数量出错导致报错。
如果既不需要为对象添加行为,也提前知道要存储哪些数据,那么就可以用命名 元组 。 命名元组是一种带有属性的元组,它们是组合只读数据的很好的方式。相比一般的元组,构造命名元组需要稍微多一点儿工作。首先,需要导入namedtuple,因为它并不在默认的命名空间里。然后通过名字和属性来定义一个命名元组。这会返回一个像类一样的对象,可以用所需的值进行实例化。
命名元组的构造函数接受两个参数typename,field_names:typename表示元组的名字;field_names表示元组各个元素的名称,也就是属性名称(由空格分隔的属性的字符串)。
from collections import namedtupleSensor = namedtuple("Sensor","ID CURRENTVALUE MAXVALUE MINVALUE")sensor_tuple = Sensor(ID = "16",CURRENTVALUE = 32,MAXVALUE = 62,MINVALUE = 2)# 可以像访问对象的属性一样访问元组的属性print(sensor_tuple.CURRENTVALUE)print(sensor_tuple,type(sensor_tuple),type(Sensor))
命名元组非常适合表示“只有数据”的情况,但并不是对所有情况来说都非常理想。和元组及字符串一样,命名元组也是不可变的,因此一旦为属性设定了值之后就不能更改。如果需要修改存储的数据,可能用字典类型更合适。