常用数据结构之元组
常用数据结构之元组(Tuple):定义、操作与最佳实践
在前两节课中,我们学习了 Python 中最常用的可变序列——列表。它灵活而强大,适合需要频繁修改数据的场景。但在某些情况下,我们更需要一种稳定、只读、不可更改的容器,来保护数据结构的完整性,这时就轮到另一种**不可变序列——元组(Tuple)**登场了。
🧭 一、什么是元组(Tuple)?
元组是 Python 的一种有序、不可变的数据结构,类似于列表,但一旦定义,其内部的数据就不能被修改。我们可以将其视作“只读版的列表”。
✅ 定义语法
t1 = (35, 12, 98) # 三元组
t2 = ('骆昊', 45, True, '成都') # 四元组
t3 = () # 空元组
t4 = ('hello', ) # 一元组(注意逗号!)
⚠️ 注意事项:单元素元组必须加逗号
a = ('hello') # 实际是 str 类型
b = ('hello', ) # 才是 tuple 类型
🔧 二、元组的常用操作
虽然元组是不可变的,但它仍然支持与列表相同的读操作。
🔹 基本操作
print(len(t1)) # 元素个数
print(t1[0]) # 索引访问
print(t2[:2]) # 切片访问
print(12 in t1) # 成员测试
print(t1 + t2) # 拼接元组
🔹 循环遍历
for item in t1:
print(item)
🔹 比较运算(元素逐个比较)
print(t1 == t2)
print(t1 < (36, 10, 99))
实际应用:元组比较可用于版本号比较、时间排序、字典排序键值等场景。
📦 三、打包与解包(Packing & Unpacking)
✅ 自动打包(多个值 → 一个元组)
a = 1, 2, 3 # 自动打包成元组
print(a) # (1, 2, 3)
✅ 自动解包(元组 → 多个变量)
x, y, z = a
✅ 星号表达式(可变参数解包)
t = (1, 2, 3, 4, 5)
a, *b = t # a = 1, b = [2, 3, 4, 5]
a, *b, c = t # a = 1, b = [2, 3, 4], c = 5
实战应用:可用于“跳过头尾”、“解构函数返回值”、“简洁处理不定长数据”。
🔁 四、交换变量值的 Python 式写法
✅ 两个变量交换
a, b = 3, 5
a, b = b, a
✅ 多个变量循环赋值
a, b, c = 1, 2, 3
a, b, c = b, c, a # 循环左移
📌 最佳实践:在数据变换、算法设计中常用于“变量轮换”、“队列迁移”等。
🧪 五、元组 vs 列表:谁更适合你的场景?
特性 | 列表(List) | 元组(Tuple) |
---|---|---|
可变性 | ✅ 可变 | ❌ 不可变(定义后不能改) |
元素操作 | 支持增删改查 | 只支持查找和遍历 |
执行效率 | 较慢(需额外内存与逻辑) | 更快(内存与性能友好) |
使用场景 | 临时数据、可修改集合 | 常量集合、配置参数 |
线程安全性 | ❌ 容易被更改 | ✅ 不可变更适合并发场景 |
存储开销 | 相对较大 | 更小,构建更快 |
⏱ 创建速度测试(timeit 模块)
import timeit
print('List:', timeit.timeit('[1,2,3,4,5,6,7,8,9]', number=10_000_000))
print('Tuple:', timeit.timeit('(1,2,3,4,5,6,7,8,9)', number=10_000_000))
输出样例(取决于硬件):
List: 0.635 秒
Tuple: 0.078 秒
🔁 六、列表与元组的相互转换
✅ tuple → list
t = (1, 2, 3)
lst = list(t)
✅ list → tuple
lst = ['a', 'b']
t = tuple(lst)
✅ 场景应用:
- 如果原本是配置项,建议用元组(不允许被改);
- 如果后续要进行增删,建议用列表;
- 多线程共享数据,优先元组;
- 作为
dict
的键,必须用不可变类型,如元组。
💡 七、真实应用场景举例
场景 | 用法与说明 |
---|---|
函数返回多个值 | return x, y, z 返回一个元组,调用时自动解包 |
不可变键结构 | dict[{x, y}] 报错,但可以用 dict[(x, y)] |
数据库记录 | SQL 查询结果往往是元组类型,适合遍历读取但不可修改 |
枚举坐标 | for i, j in [(0, 1), (1, 2), (2, 3)] 是二维迭代常用写法 |
🎯 总结归纳
- 元组是不可变的有序序列,适合用于不希望数据被修改的场景。
- 解包语法让 Python 在多变量赋值上极具简洁性;
- 使用星号表达式,可以实现灵活的“剩余值处理”;
- 在并发、高性能场景中,元组比列表更合适;
- 可以互转,开发中推荐“配置用 tuple、处理用 list”。
📌 一句话记住:
“元组用于安全地保存数据,列表用于灵活地处理数据。”
如需打印版笔记、课后练习题或下一节课程(字符串、字典或集合结构),请回复关键词:
字符串
字典
集合
我会继续为你整理成系统教学文稿。