Python 元组

元组是Python中的另一种序列类型,就像一个"上了锁的盒子",一旦创建就不能更改里面的内容。元组与列表相似,但有一个重要的区别:元组是不可变的

为什么使用元组?

元组非常适用于存储不应更改的数据:

  • 一年中的月份
  • 一周中的七天
  • 数学常数(如π)
  • 程序配置选项
  • 函数返回多个值时的结构

不可变性是元组的核心特性

元组一旦创建,就不能修改、添加或删除其中的元素。这使得元组更安全、更高效,特别适合存储不应更改的数据。

创建元组

创建元组使用圆括号( )或直接使用逗号分隔的值:

# 创建空元组
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
重要警告

由于元组是不可变的,尝试修改元组会导致错误:

days = ("周一", "周二", "周三")

# 以下操作都会引发错误!
# 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: 蓝色

元组操作

虽然不能修改现有元组,但可以创建新元组:

连接(+)

连接两个元组创建新元组

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) # 输出: ('周一', '周二', '周三', '周四', '周五')

元组方法

元组虽然不可变,但有几个有用的方法:

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

元组与列表转换

可以在元组和列表之间互相转换:

# 列表转元组
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()函数互相转换

✓ 使用场景: 固定数据、函数返回多个值、字典键

✓ 元组解包: 同时赋值多个变量

元组小测验

看看你是否掌握了这些知识:

  1. 元组和列表的主要区别是什么?
  2. 如何创建一个只有一个元素的元组?
  3. 为什么说元组比列表更安全?
  4. 如何交换两个变量的值?
  5. 函数返回多个值时,使用元组有什么好处?