元组练习题
一、元组创建与访问
练习 1.1
写出创建元组的代码:
- 空元组
- 包含三个元素:
"红","绿","蓝" - 只有一个元素
100的元组(注意单元素元组的写法)
参考代码:
empty = ()
colors = ("红", "绿", "蓝")
single = (100,) # 必须加逗号,否则 (100) 是整数
print(type(single)) # <class 'tuple'>
练习 1.2
元组 t = (10, 20, 30, 40, 50)。用索引或切片写出表达式,得到:
- 第一个元素
- 最后一个元素
- 第 2 到第 4 个元素(索引 1 到 3)组成的元组
参考代码:
t = (10, 20, 30, 40, 50)
print(t[0]) # 10
print(t[-1]) # 50
print(t[1:4]) # (20, 30, 40)
练习 1.3
下面哪一行会报错?为什么?
t = (1, 2, 3)
# A. t[1] = 20
# B. t = (4, 5, 6)
答案: A 会报错。元组不可变,不能对元素赋值。B 正确:是给变量 t 重新赋值为新元组,没有修改原元组。
二、元组 vs 列表
练习 2.1
判断下面场景更适合用元组还是列表,并简要说明理由:
- 存储一个点的坐标 (x, y)
- 存储用户输入的多门课程成绩,后续可能继续添加
- 需要作为字典的键使用
参考答案:
- 元组——坐标是固定两个值,不需要修改。
- 列表——成绩会动态增加,需要 append 等操作。
- 元组——字典的键必须不可变,列表不能当键。
练习 2.2
元组有没有 append、remove 方法?为什么?
答案: 没有。元组是不可变类型,创建后不能增删改元素,所以没有会改变自身的方法。
三、元组解包(解构赋值)
练习 3.1
用元组解包把元组 (100, 200) 的两个值分别赋给变量 x 和 y,并打印。写出代码。
参考代码:
t = (100, 200)
x, y = t
print(x, y) # 100 200
练习 3.2
不创建元组变量,直接用解包写法交换变量 a 和 b 的值(已知 a=1, b=2),然后打印 a, b。
参考代码:
a, b = 1, 2
a, b = b, a
print(a, b) # 2 1
练习 3.3
元组 t = (1, 2, 3, 4, 5)。用解包把第一个元素赋给 first,其余赋给列表 rest(用 *rest)。写出代码并打印 first 和 rest。
参考代码:
t = (1, 2, 3, 4, 5)
first, *rest = t
print(first) # 1
print(rest) # [2, 3, 4, 5]
练习 3.4
函数定义如下:
def get_size():
return 100, 50
用一行解包接收返回值,得到变量 width 和 height,并打印。
参考代码:
def get_size():
return 100, 50
width, height = get_size()
print(width, height) # 100 50
四、元组在实际项目中的用法
练习 4.1
用元组表示一组“允许的文件扩展名”:("jpg", "png", "gif"),赋给变量 ALLOWED_EXT。写一个判断:若字符串 filename = "photo.png" 的扩展名(取最后一个 . 后面的部分)在 ALLOWED_EXT 中,则打印“允许”,否则打印“不允许”。(扩展名可用 filename.split(".")[-1] 简单得到。)
参考代码:
ALLOWED_EXT = ("jpg", "png", "gif")
filename = "photo.png"
ext = filename.split(".")[-1]
if ext in ALLOWED_EXT:
print("允许")
else:
print("不允许")
练习 4.2
用“元组列表”表示配置:[("host", "localhost"), ("port", 8080)]。遍历该列表,用解包打印每一行的“配置名 = 配置值”。
参考代码:
config = [("host", "localhost"), ("port", 8080)]
for name, value in config:
print(name, "=", value)
# host = localhost
# port = 8080
五、典型应用场景
练习 5.1(函数返回多个值)
写一个函数 min_max(lst),接收一个数字列表,返回列表中的最小值和最大值(用 return 两个值)。在外部用解包接收,并打印。
参考代码:
def min_max(lst):
return min(lst), max(lst)
nums = [3, 1, 4, 1, 5]
lo, hi = min_max(nums)
print("最小:", lo, "最大:", hi) # 最小: 1 最大: 5
练习 5.2(字典的键)
创建一个字典,键为元组 (1, 2) 和 (3, 4),值分别为 "A" 和 "B"。写出代码,并打印键 (1, 2) 对应的值。
参考代码:
d = {(1, 2): "A", (3, 4): "B"}
print(d[(1, 2)]) # A
六、不可变与内部可变对象、变量重新赋值
练习 6.1
元组 t = (1, [2, 3], 4)。
问:能否执行 t[1].append(10)?执行后 t 是什么?能否执行 t[0] = 10?
答案: 可以执行 t[1].append(10)。元组不能改“这一格指向谁”,但这一格指向的列表内部可以改。执行后 t 为 (1, [2, 3, 10], 4)。不能执行 t[0] = 10,会报错,因为不能修改元组的元素本身。
练习 6.2
先执行:t = (1, 2, 3),再执行 t = (4, 5, 6)。
问:第二行是否修改了原来的元组 (1, 2, 3)?变量 t 最后指向什么?
答案: 没有修改原来的元组。第二行是让变量 t 指向新的元组 (4, 5, 6)。原来的 (1, 2, 3) 若没有其他引用,会被回收。
七、综合练习
练习 7.1
按顺序完成,写出完整代码:
- 创建元组
point = (10, 20),用解包得到x,y并打印。 - 创建元组
triple = (1, [2, 3], 4),对中间的列表执行append(5),然后打印triple。 - 把变量
point重新赋值为新元组(0, 0),打印point。
参考代码:
point = (10, 20)
x, y = point
print(x, y) # 10 20
triple = (1, [2, 3], 4)
triple[1].append(5)
print(triple) # (1, [2, 3, 5], 4)
point = (0, 0)
print(point) # (0, 0)
练习 7.2
写一个函数 first_last(seq),接收一个序列(列表或元组),返回第一个和最后一个元素组成的元组,并用解包接收返回值后打印。
参考代码:
def first_last(seq):
return seq[0], seq[-1]
t = (10, 20, 30, 40)
first, last = first_last(t)
print(first, last) # 10 40