09.Python中元组练习题

元组练习题

一、元组创建与访问

练习 1.1

写出创建元组的代码:

  1. 空元组
  2. 包含三个元素:"红", "绿", "蓝"
  3. 只有一个元素 100 的元组(注意单元素元组的写法)

参考代码:

empty = ()
colors = ("红", "绿", "蓝")
single = (100,)   # 必须加逗号,否则 (100) 是整数
print(type(single))   # <class 'tuple'>

练习 1.2

元组 t = (10, 20, 30, 40, 50)。用索引或切片写出表达式,得到:

  1. 第一个元素
  2. 最后一个元素
  3. 第 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

判断下面场景更适合用元组还是列表,并简要说明理由:

  1. 存储一个点的坐标 (x, y)
  2. 存储用户输入的多门课程成绩,后续可能继续添加
  3. 需要作为字典的键使用

参考答案:

  1. 元组——坐标是固定两个值,不需要修改。
  2. 列表——成绩会动态增加,需要 append 等操作。
  3. 元组——字典的键必须不可变,列表不能当键。

练习 2.2

元组有没有 appendremove 方法?为什么?

答案: 没有。元组是不可变类型,创建后不能增删改元素,所以没有会改变自身的方法。


三、元组解包(解构赋值)

练习 3.1

元组解包把元组 (100, 200) 的两个值分别赋给变量 xy,并打印。写出代码。

参考代码:

t = (100, 200)
x, y = t
print(x, y)   # 100 200

练习 3.2

不创建元组变量,直接用解包写法交换变量 ab 的值(已知 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)。写出代码并打印 firstrest

参考代码:

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

一行解包接收返回值,得到变量 widthheight,并打印。

参考代码:

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

按顺序完成,写出完整代码:

  1. 创建元组 point = (10, 20),用解包得到 x, y 并打印。
  2. 创建元组 triple = (1, [2, 3], 4),对中间的列表执行 append(5),然后打印 triple
  3. 把变量 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

发表评论