Python 常用复合数据类型:元组与命名元组详解
摘要
元组作为一种不可变序列类型,能够容纳多种数据类型的元素,具备良好的稳定性和可哈希特性,适用于如字典键等场景。而命名元组作为其子类,通过字段名称增强了数据可读性,提升了代码表达的清晰度。本文详细讲解了这两类元组的使用技巧及其适用场景。
文档与代码下载方式
本文主要面向具备基础 Python 编程知识以及嵌入式开发经验的读者,重点介绍面向对象编程在上位机开发中的具体应用。相较于市面上其他教程,本文结合串口通信、数据处理和动态图示等实例,使用 Sourcetrail 可视化工具辅助代码理解,具备更强的工程实用性。
正文
元组的定义与特性
元组是一种有序结构,用于按顺序存储多个对象。其最大的特点在于不可变性,即一旦创建后,不能修改其中的元素。这一特性使得元组能够被安全地用于需要哈希值的场景,如作为字典的键。
元组主要用于数据的存储,而非行为的封装。要对元组中的元素进行操作,通常需要将其传递给函数或方法。在数据结构设计中,元组常用于将不同性质的数据组合成一个逻辑单元。
通常情况下,元组中的元素具有不同含义,比如可以表示传感器 ID、当前值、最大值和最小值等。这种组合方式有助于将数据封装在一个统一的结构中,从而替代没有行为的简单数据对象。
元组可以通过逗号分隔的方式直接创建,虽然括号不是必须的,但为了提升可读性,通常建议使用。例如:
# 传感器信息的元组表示sensor_tuple = ("16", 32, 62, 2)print(sensor_tuple, type(sensor_tuple))# 不使用括号创建元组,语法仍然成立sensor_tuple = "16", 32, 62, 2print(sensor_tuple, type(sensor_tuple))在函数调用、列表推导或生成器等上下文中,括号是必须的,否则 Python 解释器可能无法正确识别元组。此外,当函数返回多个值时,通常返回的是一个元组。接收方可以使用解包操作将元组中的值分配到多个变量中。
命名元组的引入与使用
普通元组通过索引访问元素,当元素较多时,容易导致可读性下降,增加开发人员理解数据结构的难度。此外,在函数返回值传递过程中,若顺序或数量不匹配,容易引发错误。
命名元组为此类问题提供了优化方案。它在元组的基础上扩展了字段名称,使得访问过程更加直观。适用于只读数据结构的构建,尤其适合用于表示“仅有数据”的对象。
使用命名元组前,需从 collections 模块导入 namedtuple 工具。通过指定类型名称和字段名,可创建自定义的命名元组结构。例如:
from collections import namedtuple# 定义传感器相关的命名元组结构Sensor = 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))与普通元组类似,命名元组也是不可变的,一旦设定,字段值无法更改。因此,如果需要可修改的数据结构,应考虑使用字典或自定义类。