Python基础 : 元组(Tuple)
文章目录
一、知识点详解
1.1 元组定义
元组是Python中一种不可变
的有序
序列,使用圆括号()
创建(括号可省略,但逗号不可省略)
-
创建元组:
- 空元组:
empty = ()
或empty = tuple()
- 单元素元组:如
single = (10,)
← 必须有逗号, 否则(10)
会被识别为整数 - 多元素元组:
colors = ("red", "green", "blue")
, 也可省略( )
写为 :colors = "red", "green", "blue"
- 空元组:
-
元组特性:
- 元素不可修改(内存地址不变)
- 可包含任意数据类型(如嵌套列表、字典等)
- 比列表更节省内存,操作效率更高
-
不可变性:
- 元组的不可变性实质是
存储的元素引用
不可变,若元素为可变对象(如列表),其内容仍可修改
- 元组的不可变性实质是
1.2 基础操作
操作 | 说明 | 示例 |
---|---|---|
索引访问 | 从0开始,支持负数索引 | colors[0] → "red" |
切片操作 | 生成新元组 | colors[1:] → ("green", "blue") |
连接元组 | + 拼接生成新元组 | (1,2) + (3,) → (1,2,3) |
重复元组 | * 重复元素 | ("OK",)*3 → ("OK","OK","OK") |
成员检测 | in 判断元素是否存在 | "red" in colors → True |
1.3 查询方法
方法 | 说明 | 示例 |
---|---|---|
index(x) | 返回第一个值为x的索引,找不到则报错 | colors.index("green") → 1 |
count(x) | 统计x出现的次数 | (1,2,2,3).count(2) → 2 |
len() | 返回元组长度 | len(colors) → 3 |
1.4 类型转换
转换类型 | 方法 | 示例 |
---|---|---|
列表→元组 | tuple(list) | tuple([1,2]) → (1,2) |
元组→列表 | list(tuple) | list(("a","b")) → ["a","b"] |
字符串→元组 | tuple("abc") | ("a","b","c") |
注意 : 字符串转元组时,tuple("abc")
会拆分为字符元组('a','b','c')
,而非单元素元组
1.5 不可变性验证
# 直接修改元素会报错
t1 = (3, 5)
t1[0] = 4 # TypeError: 'tuple'不支持修改
# 但若元素是可变对象(如列表),可修改其内部值
t2 = (1, [2, 3], 4)
t2[1][0] = 99
# 列表对象在元组中的引用未变(id(t2[1])不变),仅修改其内部元素 → (1, [99, 3], 4)
二、说明示例
# 1.创建元组
# 空元组
empty = () or tuple()
# 单元素元组(必须带逗号!)
single = (10,) # 或 single = 10,
wrong_single = (10) # 错误,实为整数
# 多元素元组(括号可选)
multi = ("red", "green") # 或 multi = "red", "green"
# 2.基础操作
person = ("张三", 25, ["篮球", "游泳"], {"城市": "北京"}) # 创建复杂元组
# 索引与切片
print(person[0]) # "张三"
print(person[-1]["城市"]) # "北京"(访问嵌套字典)
print(person[2][:1]) # ["篮球"](嵌套列表切片)
# 连接/重复
t_concat = (1, 2) + (3,) # (1, 2, 3)
t_repeat = ("ok",) * 3 # ("ok", "ok", "ok")
# 成员检测
print("张三" in person) # True
# 3.查询操作
nums = (3, 1, 2, 1, 4)
print(nums.index(1)) # 1(首个1的索引)
print(nums.count(1)) # 2(1出现次数)
print(len(nums)) # 5(长度)
# 4. 类型转换
list_to_tuple = tuple([1, 2]) # (1, 2)
tuple_to_list = list(("x", "y")) # ["x", "y"]
# 字符串→元组(拆分为单个字符)
str_to_tuple = tuple("abc") # ('a', 'b', 'c')
# 5.不可变性验证
fixed = (3, 5)
# fixed[0] = 4 # 报错!TypeError
mutable_nested = (1, [2, 3])
mutable_nested[1][0] = 99 # 允许!修改嵌套列表内容
print(mutable_nested) # (1, [99, 3])
三、知识点总结
- 元组定义:
不可变有序序列,用()
创建,空、单元素、多元素元组创建方式有别,元素不可修改但可含任意类型,内存占用少效率高。 - 基础操作:支持索引、切片、连接、重复、成员检测操作。
- 查询方法:
index(x)
、count(x)
、len()
可用于查询。 - 不可变性:直接修改元素报错,嵌套可变对象可修改内部值。
- 类型转换:列表、字符串与元组可相互转换。
- 常见错误:
- 误用单元素元组:
(5)
是整数,(5,)
才是元组 - 忽略不可变性:直接修改元组会触发
TypeError
- 混淆
index()
与find()
:字符串有find()
,元组只有index()
- 误用单元素元组:
四、扩展知识
4.1 元组 VS 列表
特性 | 元组 | 列表 |
---|---|---|
可变性 | 不可变 | 可变 |
内存占用 | 更小(适合存储大量只读数据) | 更大 |
方法 | 仅查询方法(count/index) | 增删改查方法丰富 |
应用场景 | 字典键、函数多返回值、配置 | 动态数据集合、频繁修改操作 |
4.2 元组推导式?
元组推导式的本质
Python中没有直接的 “元组推导式” 语法,但可以通过以下两种方式实现类似效果:
方法1:生成器表达式 + tuple()
# 使用生成器表达式创建元组
t = tuple(x**2 for x in range(5))
print(t) # 输出: (0, 1, 4, 9, 16)
方法2:列表推导式 + tuple()
# 先用列表推导式创建列表,再转换为元组
t = tuple([x**2 for x in range(5)])
print(t) # 输出: (0, 1, 4, 9, 16)
与列表推导式的区别
特性 | 列表推导式 | 元组"推导式" |
---|---|---|
语法 | [x for x in ...] | tuple(x for x in ...) |
内存占用 | 立即生成所有元素 | 生成器惰性求值 |
性能 | 创建稍快 | 转换需要额外步骤 |
4.3 实际应用示例
-
快速创建数值元组
squares = tuple(i*i for i in range(10)) print(squares) # (0, 1, 4, 9, 16, 25, 36, 49, 64, 81)
-
过滤元素创建元组
evens = tuple(x for x in range(20) if x % 2 == 0) print(evens) # (0, 2, 4, 6, 8, 10, 12, 14, 16, 18)
-
处理嵌套结构
matrix = [(1, 2), (3, 4), (5, 6)] flatten = tuple(num for row in matrix for num in row) print(flatten) # (1, 2, 3, 4, 5, 6)
五、知识点考察题
以下哪一个选项能正确创建一个包含单元素Python
的元组?( )
- A.
t = ("Python")
- B.
t = "Python",
- C.
t = tuple("Python")
- D.
t = (Python,)
答案:B