模块课程(2/4)
元组和拆包
元组是一个有序且不可变的序列:一旦创建,您可以 不再改变其元素。它是用括号写的(尽管 真正定义它的是逗号)。
创建一个元组
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 编写方式的功能
nome, anni = ("Ada", 36)
nome # 'Ada'
anni # 36它也可以在没有括号的情况下工作(逗号定义了 元组):
x, y = 10, 20并且它允许无需临时变量,纯Python 成语:
a, b = 1, 2
a, b = b, a
a, b # (2, 1)使用 * 解压(其余)
当您想要捕捉“第一个和其余”或“第一个、最后一个”时, 中间”:
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,)。没有它,任何操作
以令人困惑的方式失败。
x = (42)
type(x) # <class 'int'>
x = (42,)
type(x) # <class 'tuple'>单元素元组
要创建仅包含一个元素的元组,仅使用括号是不够的:必须插入尾随逗号,例如 t = (42,)。如果没有逗号,Python 将括号视为简单的数学分组,创建一个普通整数 42。
尝试一下
给定 `a = 1` 和 `b = 2`,在一行中交换它们的值(元组解包)并评估元组 (a, b)。
显示提示
a、b = b、a
3 次尝试后可用的解决方案
复习练习
从列表“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 次尝试后可用的解决方案
额外的挑战
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 次尝试后可用的解决方案