元组(Tuple) #
元组是Python中的不可变序列,一旦创建就不能修改。
一、创建元组 #
1.1 基本创建 #
python
# 空元组
empty = ()
empty = tuple()
# 带元素的元组
numbers = (1, 2, 3, 4, 5)
strings = ("apple", "banana", "cherry")
mixed = (1, "hello", 3.14, True)
# 单元素元组(注意逗号)
single = (1,) # 元组
not_tuple = (1) # 整数,不是元组
print(type(single)) # <class 'tuple'>
print(type(not_tuple)) # <class 'int'>
# 省略括号
coordinates = 10, 20, 30
print(type(coordinates)) # <class 'tuple'>
1.2 使用tuple()函数 #
python
# 从其他可迭代对象创建
tuple_from_list = tuple([1, 2, 3]) # (1, 2, 3)
tuple_from_string = tuple("hello") # ('h', 'e', 'l', 'l', 'o')
tuple_from_range = tuple(range(3)) # (0, 1, 2)
二、访问元素 #
2.1 索引访问 #
python
fruits = ("apple", "banana", "cherry", "date")
# 正向索引
print(fruits[0]) # "apple"
print(fruits[2]) # "cherry"
# 反向索引
print(fruits[-1]) # "date"
print(fruits[-2]) # "cherry"
2.2 切片操作 #
python
numbers = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
print(numbers[2:5]) # (2, 3, 4)
print(numbers[:3]) # (0, 1, 2)
print(numbers[7:]) # (7, 8, 9)
print(numbers[::2]) # (0, 2, 4, 6, 8)
print(numbers[::-1]) # (9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
三、元组不可变性 #
3.1 不能修改 #
python
fruits = ("apple", "banana", "cherry")
# 不能修改元素
# fruits[0] = "orange" # TypeError
# 不能添加元素
# fruits.append("date") # AttributeError
# 不能删除元素
# del fruits[0] # TypeError
3.2 可变元素的处理 #
python
# 元组包含可变元素时,可变元素可以修改
person = ("Tom", 25, ["Python", "JavaScript"])
# 不能修改元组本身
# person[0] = "Jerry" # TypeError
# 但可以修改内部的列表
person[2].append("Go")
print(person) # ('Tom', 25, ['Python', 'JavaScript', 'Go'])
person[2][0] = "Rust"
print(person) # ('Tom', 25, ['Rust', 'JavaScript', 'Go'])
四、元组解包 #
4.1 基本解包 #
python
# 变量解包
point = (10, 20)
x, y = point
print(x, y) # 10 20
# 交换变量
a, b = 1, 2
a, b = b, a
print(a, b) # 2 1
# 函数返回多个值
def get_stats(numbers):
return min(numbers), max(numbers), sum(numbers)
minimum, maximum, total = get_stats([1, 2, 3, 4, 5])
print(minimum, maximum, total) # 1 5 15
4.2 扩展解包 #
python
# 星号表达式
numbers = (1, 2, 3, 4, 5)
first, *rest = numbers
print(first) # 1
print(rest) # [2, 3, 4, 5]
*beginning, last = numbers
print(beginning) # [1, 2, 3, 4]
print(last) # 5
first, *middle, last = numbers
print(first) # 1
print(middle) # [2, 3, 4]
print(last) # 5
4.3 嵌套解包 #
python
# 嵌套元组解包
nested = (1, (2, 3), 4)
a, (b, c), d = nested
print(a, b, c, d) # 1 2 3 4
# 三维坐标
point_3d = (1, (2, 3), 4)
x, (y, z), w = point_3d
五、元组方法 #
5.1 count和index #
python
numbers = (1, 2, 3, 2, 4, 2, 5)
# count:统计出现次数
print(numbers.count(2)) # 3
print(numbers.count(6)) # 0
# index:查找索引
print(numbers.index(3)) # 2
print(numbers.index(2, 2)) # 3(从索引2开始查找)
# numbers.index(6) # ValueError
5.2 长度和成员检查 #
python
fruits = ("apple", "banana", "cherry")
# 长度
print(len(fruits)) # 3
# 成员检查
print("apple" in fruits) # True
print("orange" in fruits) # False
六、元组运算 #
6.1 拼接 #
python
a = (1, 2, 3)
b = (4, 5, 6)
# 使用 +
c = a + b
print(c) # (1, 2, 3, 4, 5, 6)
# 使用 +=(创建新元组)
a += b
print(a) # (1, 2, 3, 4, 5, 6)
6.2 重复 #
python
# 使用 *
zeros = (0,) * 5
print(zeros) # (0, 0, 0, 0, 0)
6.3 比较运算 #
python
# 相等比较
print((1, 2, 3) == (1, 2, 3)) # True
print((1, 2, 3) == (3, 2, 1)) # False
# 大小比较(字典序)
print((1, 2) < (1, 3)) # True
print((1, 2) < (1, 2, 3)) # True
七、元组与列表转换 #
7.1 相互转换 #
python
# 元组转列表
tuple_data = (1, 2, 3)
list_data = list(tuple_data)
print(list_data) # [1, 2, 3]
# 列表转元组
list_data = [1, 2, 3]
tuple_data = tuple(list_data)
print(tuple_data) # (1, 2, 3)
7.2 何时使用元组 #
python
# 使用元组的场景:
# 1. 数据不应该被修改
days = ("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")
# 2. 函数返回多个值
def get_position():
return (10, 20)
# 3. 字典的键(列表不能作为键)
locations = {
(0, 0): "Origin",
(1, 0): "Point A",
(0, 1): "Point B"
}
# 4. 常量配置
HTTP_STATUS = (200, 404, 500)
八、命名元组 #
8.1 基本使用 #
python
from collections import namedtuple
# 定义命名元组
Point = namedtuple('Point', ['x', 'y'])
Person = namedtuple('Person', 'name age city')
# 创建实例
p = Point(10, 20)
print(p.x, p.y) # 10 20
print(p[0], p[1]) # 10 20(仍然可以用索引)
person = Person("Tom", 25, "Beijing")
print(person.name) # Tom
print(person.age) # 25
print(person.city) # Beijing
8.2 命名元组方法 #
python
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
# _asdict:转为字典
print(p._asdict()) # {'x': 10, 'y': 20}
# _replace:创建新实例(替换字段)
p2 = p._replace(x=30)
print(p2) # Point(x=30, y=20)
# _fields:字段名
print(Point._fields) # ('x', 'y')
# _make:从可迭代对象创建
p3 = Point._make([5, 10])
print(p3) # Point(x=5, y=10)
九、元组应用场景 #
9.1 函数返回多值 #
python
def find_min_max(numbers):
return min(numbers), max(numbers)
minimum, maximum = find_min_max([1, 2, 3, 4, 5])
9.2 多重赋值 #
python
# 优雅地交换变量
a, b = 1, 2
a, b = b, a
# 遍历字典项
person = {"name": "Tom", "age": 25}
for key, value in person.items():
print(f"{key}: {value}")
9.3 作为字典键 #
python
# 坐标作为键
grid = {
(0, 0): "A",
(0, 1): "B",
(1, 0): "C"
}
print(grid[(0, 0)]) # "A"
9.4 格式化字符串 #
python
# 旧式格式化
point = (10, 20)
print("坐标:%s" % (point,)) # 注意逗号
print("坐标:(%d, %d)" % point)
十、总结 #
| 特点 | 说明 |
|---|---|
| 不可变 | 创建后不能修改 |
| 有序 | 元素有固定顺序 |
| 允许重复 | 可以有相同元素 |
| 异构 | 可以存储不同类型 |
| 可哈希 | 可作为字典键(元素都可哈希时) |
元组 vs 列表:
| 特性 | 元组 | 列表 |
|---|---|---|
| 可变性 | 不可变 | 可变 |
| 语法 | () |
[] |
| 方法 | count(), index() |
更多方法 |
| 速度 | 更快 | 稍慢 |
| 内存 | 更小 | 更大 |
| 字典键 | 可以 | 不可以 |
使用建议:
- 数据不应改变时使用元组
- 需要修改时使用列表
- 作为字典键时使用元组
- 函数返回多值时使用元组
最后更新:2026-03-16