在Python中,元组(Tuple)是一种有序、不可变的数据结构。元组使用小括号 () 表示,可以存储多个不同类型的数据。与列表类似,但元组一旦创建,其元素不能被修改,被称为"冰冻的列表"。
在 Python 中,创建列表通常用 tuple 函数或圆括号 ()。
与 list 函数类似,tuple 可以将参数中的可迭代对象转换成元组:
tuple('四川外国语大学')
('四', '川', '外', '国', '语', '大', '学')
tuple(['四川外国语大学', '重庆大学', '西南大学', '四川美术学院'])
('四川外国语大学', '重庆大学', '西南大学', '四川美术学院')
使用圆括号 () 创建元组时,需要在元组中列出所有元素:
university_in_CQ=('四川外国语大学', '重庆大学', '西南大学', '四川美术学院')
university_in_CQ
('四川外国语大学', '重庆大学', '西南大学', '四川美术学院')
直接使用圆括号 () 将得到一个空的元组:
()
()
# 创建元组的方式
tuple1 = (1, 2, 3)
tuple2 = ("张三", 20, "北京") # 包含姓名、年龄、城市
# 访问元组的元素(通过索引)
print("姓名:", tuple2[0]) # 输出“张三”
print("年龄:", tuple2[1]) # 输出20
print("城市:", tuple2[2]) # 输出“北京”
姓名: 张三 年龄: 20 城市: 北京
# 元组切片
info = ("李四", 25, "重庆", "人文学院")
#print(info[1:3]) # 输出 (25, '重庆')
# 遍历元组
# for item in info:
# print(item)
# # # 计算元组长度
#print("元组长度:", len(info))
# # 合并两个元组
t1 = (1, 2)
t2 = (3, 4)
t3 = t1 + t2
print("合并后的元组:", t3)
合并后的元组: (1, 2, 3, 4)
在 Python 中, 允许一次给多个变量赋值, 称为多重赋值。 可以使用元组和列表实现多重赋值:
university_code, university_name = ('10001', '北京大学')
university_code
'10001'
假设某书店一天的顾客人数波动:
# 使用元组存储书店顾客数据(顺序:p_open, p_close, p_high, p_low)
customer_data = (15, 16, 22, 10)
# 解包元组获取具体值(与股票数据的结构类比)
p_open, p_close, p_high, p_low = customer_data
# 打印验证
print(f"开门顾客数:{p_open}人") # 输出:开门顾客数:15人
print(f"关门时顾客数:{p_close}人") # 输出:关门时顾客数:16人
print(f"最高峰顾客数:{p_high}人") # 输出:最高峰顾客数:22人
print(f"最低谷顾客数:{p_low}人") # 输出:最低谷顾客数:10人
开门顾客数:15人 关门时顾客数:16人 最高峰顾客数:22人 最低谷顾客数:10人
在列表操作中, 除了对列表进行原地修改的方法, 其他方法都可以应用在元组中, 例如索引、分片、连接和重复等,与列表不同的是,在元组中使用这些方法,会返回新的元组,而不是列表。
如果仅仅使用圆括号把一个值括起来, Python 会认为是表达式, 得到的不会是元组类型,而是值本身的类型:
x = (10.8)
type(x)
tuple
所以,如果确实希望得到一个包含单个元素的元组,需要在这一单个元素后面加上一个逗号,与表达式区分开来:
x = (10.8,)
x
(10.8,)
type(x)
tuple
在不引起二义性的情况下,可以省略圆括号:
stock_info = '600000', '浦发银行', 11.52, 11.54, 11.61, 11.4
stock_info
('600000', '浦发银行', 11.52, 11.54, 11.61, 11.4)
type(stock_info)
tuple
# 使用元组存储四川外国语大学某专业高考录取分数信息(模拟数据)
# 结构说明:(年份, 专业名称, 最低分, 平均分, 最高分, 调整后最低分)
sisu_admission = '2023', '英语专业', 600, 615, 630, 590
print(sisu_admission)
# 解包元组获取具体值(类比股票数据但更贴近文科场景)
year, major, min_score, avg_score, max_score, adjusted_min = sisu_admission
year
major
min_score
# 打印带有文科生友好注释的结果
# print(f"[{year}] {major}高考录取分:")
# print(f"最低分:{min_score}(常规)→ 调整后:{adjusted_min}(因扩招微降)") # 输出:最低分:600 → 调整后:590
# print(f"平均分:{avg_score} | 最高分:{max_score}(状元级考生)") # 输出:平均分:615 | 最高分:630
('2023', '英语专业', 600, 615, 630, 590)
600
不可变性也是元组和列表最大的区别。 如果试图修改元组的某个元素, 将会触发 TypeError 的异常:
bank_name = tuple(['浦发银行', '招商银行', '保利地产', '平安银行'])
bank_name[1] = '农业银行'
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_22840\1664667831.py in <module> 1 bank_name = tuple(['浦发银行', '招商银行', '保利地产', '平安银行']) ----> 2 bank_name[1] = '农业银行' TypeError: 'tuple' object does not support item assignment
元组的不可变性仅指的是不可以改变元组的顶层元素。如果元组中的元素本身是可变的,Python 允许修改其内容:
rate_info = (['活期存款',0.0030],['整存整取一年',0.0195],
['整存整取二年',0.0240],['整存整取三年',0.0280])
rate_info[1][1] = 0.02
#rate_info
rate_info[1][1]
0.02
| 方面 | 元组(Tuple) | 列表(List) |
|---|---|---|
| 可变性 | 不可变 | 可变 |
| 语法符号 | () 小括号 | [] 中括号 |
| 使用场景 | 不可更改的数据结构,如函数参数、地理坐标等 | 需要频繁修改的数据集合,如学生名单 |
示例对比:
# 元组:用于描述一个人(不可更改)
person = ("王五", 22, "男")
#person[0] = "赵六" # 会报错,因为元组不能修改
# 列表:用于保存学生名单(可更改)
students = ["张三", "李四", "王五"]
students[0] = "赵六" # 可以修改
print(students)
['赵六', '李四', '王五']
假设我们记录一个历史事件的元组包含:事件名、年份、地点
# 历史事件元组
event = ("五四运动", 1919, "北京大学")
print("事件名:", event[0])
# print("发生年份:", event[1])
# print("发生地点:", event[2])
事件名: 五四运动
请完成以下练习,并在下面代码框中实现:
# 练习1:书籍信息
book = ("书名", "作者", 2020)
print(book)
# 练习2:合并两个学生信息
student1 = ("小明", 18)
student2 = ("小红", 19)
students = student1 + student2
print(students)
# 练习3:电影信息
movie = ("霸王别姬", "陈凯歌", 1993)
print("导演:", movie[1])
('书名', '作者', 2020)
('小明', 18, '小红', 19)
导演: 陈凯歌