元组
Python 除了提供列表外,还有一种特殊的数据结构叫做元组 (Tuple 读作 /ˈtuːpl/)。元组是一种有序的、不可变的数据集合,一旦创建就不能修改其中的元素,这为数据提供了额外的安全性和性能优化。
创建
JavaScript 中没有直接对应的数据结构,最接近的是使用Object.freeze()
冻结数组,但这种方式在语法上不够简洁:
Python 的元组创建非常简洁,使用圆括号:
单元素元组的陷阱
创建单元素元组时必须包含逗号,否则 Python 会认为括号只是运算符:
使用构造函数创建
不可变性
这是元组与列表最重要的区别:
但是,如果元组包含可变对象,那些对象本身仍然可以被修改:
访问元素
元组的访问方式与列表完全相同:
长度
与列表一样,使用 len()
函数获取元组长度:
比较
元组比较与列表类似,Python 会逐个比较元素内容。需要注意的是,由于元组的不可变性,Python 可能会对一些简单的元组进行内部优化:
元素查找
使用 in
和 not in
关键字检查元素是否存在:
索引查找
使用 .index()
方法查找元素第一次出现的索引:
计数
使用 .count()
方法统计元素出现次数:
切片
元组支持与列表相同的切片操作:
连接操作
虽然元组不可变,但可以通过连接创建新元组:
重复操作
与字符串和列表类似,Python 元组也支持使用*
运算符进行重复操作:
复制
元组的复制特性
由于元组是不可变的,复制操作有特殊的行为:
包含可变对象的元组复制
当元组包含可变对象时,需要注意深拷贝:
解包
元组解包是 Python 多重赋值的重要基础。在前面的列表章节中,我们已经学习了解包的基本概念,元组解包的语法完全相同,但元组更适合用于固定结构的数据:
元组解包的高级用法
元组解包同样支持星号操作符,特别适合处理具有固定开头和结尾的数据:
元组推导式
在列表章节中,我们学习了列表推导式的强大功能。你可能会问:元组有推导式吗?
答案是:元组本身没有推导式语法。使用圆括号的表达式 (expression for item in iterable)
实际上创建的是生成器表达式,而不是元组:
创建元组的正确方式
要创建元组,需要将生成器表达式或其他可迭代对象传递给 tuple()
构造函数:
命名元组
虽然不是本章的重点,但值得了解 Python 还提供了命名元组,让元组更具可读性:
元组 vs 列表的选择
如果数据结构固定且不需要修改(如坐标、配置信息、函数返回的多个值),适合使用元组;如果需要动态添加、删除或修改元素(如购物车、成绩列表),适合使用列表。另外,元组由于不可变性,在内存使用和访问速度上通常比列表更高效。
元组操作一览
元组方法
由于元组的不可变性,它只有很少的方法:
方法 | 功能 | 示例 | 返回值 |
---|---|---|---|
count(item) | 统计元素出现次数 | tup.count('apple') | 出现次数 |
index(item) | 返回元素首次出现的索引 | tup.index('apple') | 索引值 |
内置函数
函数 | 功能 | 示例 | 返回值 |
---|---|---|---|
len(tup) | 获取元组长度 | len((1, 2, 3)) | 长度 |
max(tup) | 获取最大值 | max((1, 2, 3)) | 最大值 |
min(tup) | 获取最小值 | min((1, 2, 3)) | 最小值 |
sum(tup) | 计算数值元组的和 | sum((1, 2, 3)) | 总和 |
sorted(tup) | 返回排序后的列表 | sorted((3, 1, 2)) | 新的排序列表 |
tuple(iterable) | 将可迭代对象转为元组 | tuple([1, 2, 3]) | 新元组 |
运算符和关键字
操作 | 功能 | 示例 | 返回值 |
---|---|---|---|
+ | 连接元组 | (1, 2) + (3, 4) | 新元组 |
* | 重复元组 | (1, 2) * 3 | 新元组 |
in | 检查元素是否存在 | 'apple' in fruits | 布尔值 |
not in | 检查元素是否不存在 | 'apple' not in fruits | 布尔值 |
== | 比较元组内容 | (1, 2) == (1, 2) | 布尔值 |
< , > , <= , >= | 按字典序比较 | (1, 2) < (1, 3) | 布尔值 |
切片操作
操作 | 功能 | 示例 | 返回值 |
---|---|---|---|
tup[start:end] | 切片 | tup[1:3] | 新元组 |
tup[start:end:step] | 带步长切片 | tup[::2] | 新元组 |
tup[::-1] | 反转元组 | tup[::-1] | 新元组 |
小结
元组是 Python 中一种重要的不可变序列类型:
- 不可变性:一旦创建就不能修改,提供数据安全性和性能优化
- 有序性:保持元素的插入顺序,支持索引和切片操作
- 混合类型:可以存储不同类型的数据,与列表类似
- 解包功能:支持优雅的多重赋值和变量交换
- 数据组合:适合将多个相关数据组合成一个整体
- 内存效率:比列表占用更少内存,创建和访问更快
- 语法简洁:使用圆括号创建,但要注意单元素元组的逗号
- 内部优化:Python 可能会对相同内容的简单元组进行优化,使其指向同一对象
选择元组还是列表的关键在于:如果数据结构固定且不需要修改,使用元组;如果需要动态添加、删除或修改元素,使用列表。元组特别适合表示坐标、配置信息、函数返回的多个值等场景。
练习
学校要记录三个班级的基本信息,每个班级包含班级名称、学生人数、班主任姓名。请使用元组的特性完成以下任务: