跳转到主要内容
模块 3 · 第 2 课(共 4)课程中的10/36~10 min
模块课程(2/4)

元组和拆包

元组是一个有序且不可变的序列:一旦创建,您可以 不再改变其元素。它是用括号写的(尽管 真正定义它的是逗号)。

创建一个元组

Python
vuota = ()
una = (42,)             # ATTENZIONE: senza virgola, (42) è solo 42 fra parentesi
coords = (10, 20)
mista = ("Ada", 36, True)

按索引访问和切片工作与列表完全相同:coords[0], coords[-1]、mista[:2]。

何时使用元组而不是列表

  • 当值代表一个不能改变的固定集合时 (坐标,日期为 (year, month, day),版本为 (1, 2, 3))。
  • 当您需要使用该值作为 字典键 或作为元素时 a set:只能使用不可变(可哈希)对象。
  • 当您想向代码阅读器表明that值是 “冻结”。

解包:改变 Python 编写方式的功能

Python
nome, anni = ("Ada", 36)
nome   # 'Ada'
anni   # 36

它也可以在没有括号的情况下工作(逗号定义了 元组):

Python
x, y = 10, 20

并且它允许无需临时变量,纯Python 成语:

Python
a, b = 1, 2
a, b = b, a
a, b   # (2, 1)

使用 * 解压(其余)

当您想要捕捉“第一个和其余”或“第一个、最后一个”时, 中间”:

Python
primo, *resto = [1, 2, 3, 4, 5]
primo   # 1
resto   # [2, 3, 4, 5]

primo, *centro, ultimo = [1, 2, 3, 4, 5]
centro  # [2, 3, 4]

这称为 加星标作业:星标收集了所有 保留在列表中。

单元素元组陷阱

(42) 不是一个元组,它是括号内的数字 42。做一个 单元素元组需要逗号:(42,)。没有它,任何操作 以令人困惑的方式失败。

Python
x = (42)
type(x)   # <class 'int'>
x = (42,)
type(x)   # <class 'tuple'>

单元素元组

要创建仅包含一个元素的元组,仅使用括号是不够的:必须插入尾随逗号,例如 t = (42,)。如果没有逗号,Python 将括号视为简单的数学分组,创建一个普通整数 42。

尝试一下

锻炼#python.m3.l2.e1
尝试:0加载中...

给定 `a = 1` 和 `b = 2`,在一行中交换它们的值(元组解包)并评估元组 (a, b)。

正在加载编辑器...
显示提示

a、b = b、a

3 次尝试后可用的解决方案

复习练习

锻炼#python.m3.l2.e2
尝试:0加载中...

从列表“voti = [7, 5, 8, 6, 9]”中,使用解包将第一个等级提取到“primo”,最后一个提取到“ultimo”,其余的提取到“centro”。评估 `(primo, centro, ultimo)`。

正在加载编辑器...
显示提示

primo, *centro, ultimo = voti → primo=7, centro=[5,8,6], ultimo=9。

3 次尝试后可用的解决方案

额外的挑战

锻炼#python.m3.l2.e3
尝试:0加载中...

Given the tuple `point = (4, 5, 6)`, use unpacking to assign the three values to the variables `x`, `y`, `z` respectively. Then, calculate the sum of `x`, `y`, and `z` and store it in `coord_sum`. Finally, evaluate `coord_sum`.

正在加载编辑器...
显示提示

使用 x, y, z = point 在单个语句中提取三个坐标。

3 次尝试后可用的解决方案