Python 元组(Tuple)是一种有序、不可变的序列类型,与列表类似但具有不可修改的特性。以下是关于元组的所有基础知识:
1. 元组的定义
元组使用圆括号 () 定义,元素之间用逗号分隔,元素类型可以不同:
# 普通元组
t1 = (1, 2, 3, 4)
t2 = ("apple", "banana", "cherry")
t3 = (1, "hello", 3.14, True) # 包含不同类型元素
# 单元素元组(必须加逗号,否则会被视为普通括号)
t4 = (5,) # 正确的单元素元组
t5 = (5) # 这不是元组,而是整数 5
# 空元组
empty_tuple = ()
# 可以省略括号(不推荐,可读性差)
t6 = 1, 2, 3, 4
2. 元组的特性
- 有序性:元素有明确的顺序,可通过索引访问
- 不可变性:创建后不能修改、添加或删除元素
t = (1, 2, 3) # t[0] = 10 # 这会报错,元组元素不可修改 - 可重复性:允许包含重复元素
- 可哈希性:元组可以作为字典的键(列表不行)
3. 元组的索引与切片
元组的索引和切片操作与列表完全相同:
索引:从 0 开始,支持负索引
fruits = ("apple", "banana", "cherry") print(fruits[0]) # "apple" print(fruits[-1]) # "cherry"切片:
tuple[start:end:step]numbers = (0, 1, 2, 3, 4, 5) print(numbers[1:4]) # (1, 2, 3) print(numbers[:3]) # (0, 1, 2) print(numbers[3:]) # (3, 4, 5) print(numbers[::2]) # (0, 2, 4) print(numbers[::-1]) # (5, 4, 3, 2, 1, 0)
4. 元组的基本操作
访问元素:通过索引直接访问
t = ("a", "b", "c") print(t[1]) # "b"拼接元组:使用
+运算符(生成新元组,原元组不变)t1 = (1, 2, 3) t2 = (4, 5, 6) t3 = t1 + t2 # (1, 2, 3, 4, 5, 6)重复元组:使用
*运算符(生成新元组)t = ("a", "b") * 3 # ("a", "b", "a", "b", "a", "b")元组长度:使用
len()函数print(len((1, 2, 3, 4))) # 4检查元素是否存在:使用
in和not int = ("apple", "banana") print("apple" in t) # True print("orange" not in t) # True
5. 元组的常用方法
元组的方法较少(因为不可变),主要有两个常用方法:
t = (1, 2, 3, 2, 4, 2)
# index():返回指定元素的第一个匹配项的索引
print(t.index(2)) # 1
# count():计算指定元素出现的次数
print(t.count(2)) # 3
6. 元组的解包
将元组的元素赋值给多个变量:
# 基本解包
t = (10, 20, 30)
a, b, c = t
print(a) # 10
print(b) # 20
print(c) # 30
# 扩展解包(Python 3+)
t = (1, 2, 3, 4, 5)
a, *b, c = t
print(a) # 1
print(b) # [2, 3, 4](注意变成了列表)
print(c) # 5
# 忽略某些元素
t = (100, 200, 300, 400)
a, _, b, _ = t
print(a) # 100
print(b) # 300
7. 元组与列表的转换
# 列表转元组
lst = [1, 2, 3]
t = tuple(lst) # (1, 2, 3)
# 元组转列表
t = (4, 5, 6)
lst = list(t) # [4, 5, 6]
8. 元组的应用场景
- 存储不可变数据:当数据创建后不应被修改时
函数返回多个值:Python 函数返回多个值时实际是返回元组
def get_name_and_age(): return "Alice", 30 # 实际返回 ("Alice", 30) name, age = get_name_and_age() # 解包元组作为字典的键:因为元组不可变且可哈希
coords = { (0, 0): "原点", (1, 2): "点A"}保护数据不被修改:防止意外修改重要数据
- 性能优化:元组比列表占用更少内存,访问速度更快
元组与列表的核心区别在于不可变性,这使得元组在需要数据稳定性的场景中非常有用。在选择使用元组还是列表时,主要考虑数据是否需要被修改。