Python 元组
元组是Python中的另一种序列类型,就像一个"上了锁的盒子",一旦创建就不能更改里面的内容。元组与列表相似,但有一个重要的区别:元组是不可变的。
为什么使用元组?
元组非常适用于存储不应更改的数据:
- 一年中的月份
- 一周中的七天
- 数学常数(如π)
- 程序配置选项
- 函数返回多个值时的结构
不可变性是元组的核心特性
元组一旦创建,就不能修改、添加或删除其中的元素。这使得元组更安全、更高效,特别适合存储不应更改的数据。
创建元组
创建元组使用圆括号( )或直接使用逗号分隔的值:
# 创建空元组
empty_tuple = ()
# 创建包含一个元素的元组(注意逗号)
single_tuple = (42,)
# 创建多个元素的元组
days = ("周一", "周二", "周三", "周四", "周五", "周六", "周日")
# 不使用圆括号创建元组
colors = "红色", "绿色", "蓝色"
# 嵌套元组
matrix = ((1, 2, 3), (4, 5, 6), (7, 8, 9))
empty_tuple = ()
# 创建包含一个元素的元组(注意逗号)
single_tuple = (42,)
# 创建多个元素的元组
days = ("周一", "周二", "周三", "周四", "周五", "周六", "周日")
# 不使用圆括号创建元组
colors = "红色", "绿色", "蓝色"
# 嵌套元组
matrix = ((1, 2, 3), (4, 5, 6), (7, 8, 9))
0
周一
1
周二
2
周三
3
周四
4
周五
5
周六
6
周日
访问元组元素
访问元组元素的方式与列表相同,使用索引:
days = ("周一", "周二", "周三", "周四", "周五", "周六", "周日")
# 访问第一个元素
print(days[0]) # 输出: 周一
# 访问最后一个元素
print(days[-1]) # 输出: 周日
# 访问多个元素(切片)
print(days[1:4]) # 输出: ('周二', '周三', '周四')
# 访问嵌套元组
matrix = ((1, 2, 3), (4, 5, 6))
print(matrix[0][1]) # 输出: 2
# 访问第一个元素
print(days[0]) # 输出: 周一
# 访问最后一个元素
print(days[-1]) # 输出: 周日
# 访问多个元素(切片)
print(days[1:4]) # 输出: ('周二', '周三', '周四')
# 访问嵌套元组
matrix = ((1, 2, 3), (4, 5, 6))
print(matrix[0][1]) # 输出: 2
重要警告
由于元组是不可变的,尝试修改元组会导致错误:
days = ("周一", "周二", "周三")
# 以下操作都会引发错误!
# days[0] = "星期日"
# days.append("周四")
# days.pop(1)
# 以下操作都会引发错误!
# days[0] = "星期日"
# days.append("周四")
# days.pop(1)
遍历元组
可以使用for循环遍历元组中的元素:
colors = ("红色", "绿色", "蓝色")
# 简单遍历
for color in colors:
print(f"我喜欢{color}")
# 带索引的遍历
for index, color in enumerate(colors):
print(f"颜色 #{index+1}: {color}")
# 输出结果:
# 我喜欢红色
# 我喜欢绿色
# 我喜欢蓝色
# 颜色 #1: 红色
# 颜色 #2: 绿色
# 颜色 #3: 蓝色
# 简单遍历
for color in colors:
print(f"我喜欢{color}")
# 带索引的遍历
for index, color in enumerate(colors):
print(f"颜色 #{index+1}: {color}")
# 输出结果:
# 我喜欢红色
# 我喜欢绿色
# 我喜欢蓝色
# 颜色 #1: 红色
# 颜色 #2: 绿色
# 颜色 #3: 蓝色
元组操作
虽然不能修改现有元组,但可以创建新元组:
连接(+)
连接两个元组创建新元组
new_tuple = tuple1 + tuple2
重复(*)
重复元组元素创建新元组
new_tuple = tuple * 3
切片
获取元组的一部分创建新元组
new_tuple = tuple[1:4]
# 元组连接
tuple1 = (1, 2, 3)
tuple2 = (4, 5, 6)
combined = tuple1 + tuple2
print(combined) # 输出: (1, 2, 3, 4, 5, 6)
# 元组重复
colors = ("红色", "绿色")
repeated = colors * 3
print(repeated) # 输出: ('红色', '绿色', '红色', '绿色', '红色', '绿色')
# 元组切片
days = ("周一", "周二", "周三", "周四", "周五")
weekdays = days[0:5] # 创建新元组
print(weekdays) # 输出: ('周一', '周二', '周三', '周四', '周五')
tuple1 = (1, 2, 3)
tuple2 = (4, 5, 6)
combined = tuple1 + tuple2
print(combined) # 输出: (1, 2, 3, 4, 5, 6)
# 元组重复
colors = ("红色", "绿色")
repeated = colors * 3
print(repeated) # 输出: ('红色', '绿色', '红色', '绿色', '红色', '绿色')
# 元组切片
days = ("周一", "周二", "周三", "周四", "周五")
weekdays = days[0:5] # 创建新元组
print(weekdays) # 输出: ('周一', '周二', '周三', '周四', '周五')
元组方法
元组虽然不可变,但有几个有用的方法:
count()
统计元素出现的次数
tuple.count('元素')
index()
返回元素的索引位置
tuple.index('元素')
len()
获取元组长度
len(tuple)
numbers = (1, 2, 3, 2, 5, 2, 7)
# 统计元素出现次数
print(numbers.count(2)) # 输出: 3
# 查找元素索引
print(numbers.index(5)) # 输出: 4
# 获取元组长度
print(len(numbers)) # 输出: 7
# 统计元素出现次数
print(numbers.count(2)) # 输出: 3
# 查找元素索引
print(numbers.index(5)) # 输出: 4
# 获取元组长度
print(len(numbers)) # 输出: 7
元组与列表转换
可以在元组和列表之间互相转换:
# 列表转元组
fruit_list = ["苹果", "香蕉", "橙子"]
fruit_tuple = tuple(fruit_list)
print(fruit_tuple) # 输出: ('苹果', '香蕉', '橙子')
# 元组转列表
days_tuple = ("周一", "周二", "周三")
days_list = list(days_tuple)
print(days_list) # 输出: ['周一', '周二', '周三']
# 转换后可以修改列表
days_list.append("周四")
print(days_list) # 输出: ['周一', '周二', '周三', '周四']
fruit_list = ["苹果", "香蕉", "橙子"]
fruit_tuple = tuple(fruit_list)
print(fruit_tuple) # 输出: ('苹果', '香蕉', '橙子')
# 元组转列表
days_tuple = ("周一", "周二", "周三")
days_list = list(days_tuple)
print(days_list) # 输出: ['周一', '周二', '周三']
# 转换后可以修改列表
days_list.append("周四")
print(days_list) # 输出: ['周一', '周二', '周三', '周四']
元组 vs 列表
| 特性 | 元组 | 列表 |
|---|---|---|
| 可变性 | 不可变(创建后不能修改) | 可变(可以修改元素) |
| 语法 | 使用圆括号 () | 使用方括号 [] |
| 性能 | 更快(内存占用少) | 稍慢(内存占用多) |
| 方法 | 只有count()和index() | 多种方法(append, remove等) |
| 安全性 | 更安全(防止意外修改) | 修改方便但可能出错 |
| 使用场景 | 固定数据(如日期、配置) | 动态数据(如待办事项) |
元组练习
尝试解决这些练习来巩固你的元组知识:
编程挑战
练习1:坐标距离
编写函数计算两点之间的距离:
- 每个点表示为元组 (x, y)
- 使用公式:√[(x₂ - x₁)² + (y₂ - y₁)²]
示例:
点A: (3, 4)
点B: (6, 8)
距离: 5.0
练习2:学生成绩
创建一个包含学生信息的元组列表:
- 每个学生表示为 (姓名, 语文成绩, 数学成绩)
- 计算每个学生的平均分
- 找出平均分最高的学生
练习3:色彩混合
使用RGB颜色元组:(红, 绿, 蓝)
- 定义基本颜色:红色=(255,0,0), 绿色=(0,255,0), 蓝色=(0,0,255)
- 编写函数混合两种颜色:new_color = ( (r1+r2)//2, (g1+g2)//2, (b1+b2)//2 )
- 混合红色和绿色得到黄色
练习4:元组解包
使用元组解包简化代码:
- 交换两个变量的值:a, b = b, a
- 函数返回多个值
- 遍历元组列表
示例:
# 交换变量
a = 5
b = 10
a, b = b, a # 现在 a=10, b=5
总结
关键知识点回顾
✓ 元组创建: 使用圆括号()或逗号创建元组
✓ 不可变性: 一旦创建就不能修改
✓ 元素访问: 通过索引访问元素(与列表相同)
✓ 元组操作: 连接(+), 重复(*), 切片
✓ 元组方法: count(), index(), len()
✓ 转换: tuple()和list()函数互相转换
✓ 使用场景: 固定数据、函数返回多个值、字典键
✓ 元组解包: 同时赋值多个变量
元组小测验
看看你是否掌握了这些知识:
- 元组和列表的主要区别是什么?
- 如何创建一个只有一个元素的元组?
- 为什么说元组比列表更安全?
- 如何交换两个变量的值?
- 函数返回多个值时,使用元组有什么好处?