元组(Tuple)¶

智能助教

一、什么是元组?¶

在Python中,元组(Tuple)是一种有序、不可变的数据结构。元组使用小括号 () 表示,可以存储多个不同类型的数据。与列表类似,但元组一旦创建,其元素不能被修改,被称为"冰冻的列表"。

元组的典型使用场景¶

  • 表示一个固定结构的数据,如地理坐标(纬度,经度)、时间(年,月,日)
  • 作为函数的返回值打包多个值
  • 用作字典的键(列表不能作为键,因为列表是可变的)

 为什么需要元组¶

主要原因如下:

  • 元组占用的空间较小
  • 你不会意外修改元组的值
  • 可以将元组用作字典的键
  • 函数的参数是以元组形式传递的

二、元组的创建与访问¶

1.创建元组¶

在 Python 中,创建列表通常用 tuple 函数或圆括号 ()。

(1). tuple 函数¶

与 list 函数类似,tuple 可以将参数中的可迭代对象转换成元组:

In [38]:
tuple('四川外国语大学')
Out[38]:
('四', '川', '外', '国', '语', '大', '学')
In [39]:
tuple(['四川外国语大学', '重庆大学', '西南大学', '四川美术学院'])
Out[39]:
('四川外国语大学', '重庆大学', '西南大学', '四川美术学院')

(2). 圆括号¶

使用圆括号 () 创建元组时,需要在元组中列出所有元素:

In [40]:
university_in_CQ=('四川外国语大学', '重庆大学', '西南大学', '四川美术学院')
university_in_CQ
Out[40]:
('四川外国语大学', '重庆大学', '西南大学', '四川美术学院')

直接使用圆括号 () 将得到一个空的元组:

In [4]:
()
Out[4]:
()

2.元组的访问¶

In [41]:
# 创建元组的方式
tuple1 = (1, 2, 3)
tuple2 = ("张三", 20, "北京")  # 包含姓名、年龄、城市

# 访问元组的元素(通过索引)
print("姓名:", tuple2[0])  # 输出“张三”
print("年龄:", tuple2[1])  # 输出20
print("城市:", tuple2[2])  # 输出“北京”
姓名: 张三
年龄: 20
城市: 北京

三、元组的基本操作¶

虽然元组不可修改,但我们可以进行如下操作:

  • 访问元素
  • 切片
  • 遍历
  • 计算长度
  • 合并元组

1 元组的基本操作¶

In [46]:
# 元组切片
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)

2.多重赋值¶

在 Python 中, 允许一次给多个变量赋值, 称为多重赋值。 可以使用元组和列表实现多重赋值:

In [48]:
university_code, university_name = ('10001', '北京大学')
university_code
Out[48]:
'10001'

假设某书店一天的顾客人数波动:​​

  • p_open(开门时):​​ 上午9点刚开门,有 ​​15位顾客​​ 进店。
  • p_close(关门时):​​ 晚上9点关门,最后有 ​​16位顾客​​ 离店。
  • p_high(最高峰):​​ 下午3点促销活动时,顾客达到 ​​22人​​(一天中最热闹)。
  • p_low(最低谷):​​ 中午12点午餐时间,仅有 ​​10人​​ 在店里(最少的时候)。
In [49]:
# 使用元组存储书店顾客数据(顺序: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人

 四 、元组特性¶

在列表操作中, 除了对列表进行原地修改的方法, 其他方法都可以应用在元组中, 例如索引、分片、连接和重复等,与列表不同的是,在元组中使用这些方法,会返回新的元组,而不是列表。

1. 单个元素的元组¶

如果仅仅使用圆括号把一个值括起来, Python 会认为是表达式, 得到的不会是元组类型,而是值本身的类型:

In [51]:
x = (10.8)
type(x)
Out[51]:
tuple

所以,如果确实希望得到一个包含单个元素的元组,需要在这一单个元素后面加上一个逗号,与表达式区分开来:

In [22]:
x = (10.8,)
x
Out[22]:
(10.8,)
In [9]:
type(x)
Out[9]:
tuple

2. 可以省略的圆括号¶

在不引起二义性的情况下,可以省略圆括号:

In [54]:
stock_info = '600000', '浦发银行', 11.52, 11.54, 11.61, 11.4
stock_info
Out[54]:
('600000', '浦发银行', 11.52, 11.54, 11.61, 11.4)
In [24]:
type(stock_info)
Out[24]:
tuple
In [60]:
# 使用元组存储四川外国语大学某专业高考录取分数信息(模拟数据)
# 结构说明:(年份, 专业名称, 最低分, 平均分, 最高分, 调整后最低分)
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)
Out[60]:
600

3. 不可变性¶

不可变性也是元组和列表最大的区别。 如果试图修改元组的某个元素, 将会触发 TypeError 的异常:

In [62]:
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 允许修改其内容:

In [68]:
rate_info = (['活期存款',0.0030],['整存整取一年',0.0195],
             ['整存整取二年',0.0240],['整存整取三年',0.0280])
rate_info[1][1] = 0.02
#rate_info
rate_info[1][1]
Out[68]:
0.02

问问大模型¶


复制下面的提示词,点击"问问大模型",将提示词粘贴到你所使用的大模型

说明:对于这类问题,不需要使用推理模型,使用对话模型效果会更好。

提示词:
Python中的列表和元组非常相似,列表如此灵活,为什么有了列表后,还需要元组?


五、元组与列表的区别¶

方面 元组(Tuple) 列表(List)
可变性 不可变 可变
语法符号 () 小括号 [] 中括号
使用场景 不可更改的数据结构,如函数参数、地理坐标等 需要频繁修改的数据集合,如学生名单

示例对比:

In [70]:
# 元组:用于描述一个人(不可更改)
person = ("王五", 22, "男")
#person[0] = "赵六"  # 会报错,因为元组不能修改

# 列表:用于保存学生名单(可更改)
students = ["张三", "李四", "王五"]
students[0] = "赵六"  # 可以修改
print(students)
['赵六', '李四', '王五']

六、应用:历史事件记录¶

假设我们记录一个历史事件的元组包含:事件名、年份、地点

In [36]:
# 历史事件元组
event = ("五四运动", 1919, "北京大学")
print("事件名:", event[0])
# print("发生年份:", event[1])
# print("发生地点:", event[2])
事件名: 五四运动

七、练习题¶

请完成以下练习,并在下面代码框中实现:

  1. 创建一个元组,表示一本书的信息(书名、作者、出版年份),并打印出来。
  2. 创建两个元组,分别表示两个学生的基本信息(姓名、年龄),合并成一个元组。
  3. 创建一个元组,表示一个电影(片名、导演、上映年份),并输出导演名。
In [37]:
# 练习1:书籍信息
book = ("书名", "作者", 2020)
print(book)

# 练习2:合并两个学生信息
student1 = ("小明", 18)
student2 = ("小红", 19)
students = student1 + student2
print(students)

# 练习3:电影信息
movie = ("霸王别姬", "陈凯歌", 1993)
print("导演:", movie[1])
('书名', '作者', 2020)
('小明', 18, '小红', 19)
导演: 陈凯歌