理解Python3中的元组

来自菜鸟教程
(重定向自理解Python3中的元组
跳转至:导航、​搜索

介绍

tuple 是一种数据结构,它是不可变或不可更改的有序元素序列。 因为元组是不可变的,所以它们的值不能被修改。 以下是包含四个元素的示例元组:

Example Tuplecoral = ('blue coral', 'staghorn coral', 'pillar coral', 'elkhorn coral')

元组用于对数据进行分组。 元组内的每个元素或值称为一个项目。

元组在括号 ( ) 之间有值,以逗号 , 分隔。 空元组将显示为 coral = (),但只有一个值的元组必须使用逗号,如 coral = ('blue coral',)

如果我们 print() 上面的元组,我们将收到以下输出,元组仍然由括号键入:

print(coral)
Output('blue coral', 'staghorn coral', 'pillar coral', 'elkhorn coral')

在考虑作为集合类型的 Python 元组和其他数据结构时,考虑计算机上所有不同的集合很有用:文件分类、歌曲播放列表、浏览器书签、电子邮件、视频集合您可以访问流媒体服务等。

元组类似于 lists,但它们的值不能被修改。 因此,当您在代码中使用元组时,您是在向其他人传达您不打算对该值序列进行更改。 此外,由于值不会更改,因此可以通过在 Python 中使用元组来优化您的代码,因为元组的代码比列表的代码要快一些。

先决条件

您应该在您的计算机或服务器上安装 Python 3 并设置编程环境。 如果您没有设置编程环境,您可以参考本地编程环境或服务器上的编程环境适合您的操作的安装和设置指南系统(Ubuntu、CentOS、Debian 等)

索引元组

作为元素的有序序列,元组中的每个项目都可以通过索引单独调用。

每一项对应一个索引号,它是一个整数值,从索引号0开始。

Info: 要跟随本教程中的示例代码,请通过运行 python3 命令在本地系统上打开 Python 交互式 shell。 然后,您可以通过在 >>> 提示符后添加示例来复制、粘贴或编辑示例。


对于本教程开头的示例 coral 元组,索引细分如下所示:

“蓝珊瑚” '鹿角珊瑚' '支柱珊瑚' '麋鹿角珊瑚'
0 1 2 3

第一项,字符串 'blue coral' 从索引 0 开始,列表以 'elkhorn coral' 项的索引 3 结束。

因为 Python 元组中的每个项目都有相应的索引号,所以我们可以访问项目。

现在我们可以通过引用它的索引号来调用元组的离散项:

print(coral[2])
Outputpillar coral

该元组的索引号范围为 0-3,如上表所示。 因此,要单独调用任何项目,我们将引用如下索引号:

coral[0] = 'blue coral'
coral[1] = 'staghorn coral' 
coral[2] = 'pillar coral' 
coral[3] = 'elkhorn coral'

如果我们使用任何大于 3 的索引号调用元组 coral,它将超出范围,因为它无效:

print(coral[22])
OutputIndexError: tuple index out of range

除了正索引号之外,我们还可以通过从元组末尾向后计数,从 -1 开始,从具有负索引号的元组中访问项目。 如果我们有一个很长的元组并且我们想在元组的末尾精确定位一个项目,这尤其有用。

对于同一个元组 coral,负索引分解如下所示:

“蓝珊瑚” '鹿角珊瑚' '支柱珊瑚' '麋鹿角珊瑚'
-4 -3 -2 -1

所以,如果我们想通过使用它的负索引号打印出项目 'blue coral',我们可以这样做:

print(coral[-4])
Outputblue coral

我们可以使用 + 运算符将元组中的字符串项与其他字符串连接起来:

print('This reef is made up of ' + coral[1])
OutputThis reef is made up of staghorn coral

我们能够将索引号 0 处的字符串项与字符串 'This reef is made up of ' 连接起来。 我们还可以使用 + 运算符来 将 2 个或多个元组连接在一起

使用与元组中的项目相对应的索引号,我们能够离散地访问元组的每个项目。

切片元组

我们可以使用索引从元组中调出一些项目。 切片允许我们通过创建由冒号 [x:y] 分隔的索引号范围来调用多个值。

假设我们只想打印 coral 的中间项,我们可以通过创建切片来实现。

print(coral[1:3])
Output('staghorn coral', 'pillar coral')

创建切片时,如在 [1:3] 中,第一个索引号是切片开始的位置(包括),第二个索引号是切片结束的位置(不包括),这就是为什么在我们上面的示例中的项目在位置,12是打印出来的项目。

如果我们想包含列表的任一端,我们可以省略 tuple[x:y] 语法中的一个数字。 例如,如果我们想打印元组 coral 的前 3 项——这将是 'blue coral''staghorn coral''pillar coral'——我们可以这样做通过键入:

print(coral[:3])
Output('blue coral', 'staghorn coral', 'pillar coral')

这打印了元组的开头,在索引 3 之前停止。

要在元组末尾包含所有项目,我们将反转语法:

print(coral[1:])
Output('staghorn coral', 'pillar coral', 'elkhorn coral')

我们也可以在切片元组时使用负索引号,类似于正索引号:

print(coral[-3:-1])
print(coral[-2:])
Output('staghorn coral', 'pillar coral')
('pillar coral', 'elkhorn coral')

我们可以与切片一起使用的最后一个参数称为 stride,它指的是从元组中检索到第一项后向前移动的项数。

到目前为止,我们已经省略了 stride 参数,Python 默认 stride 为 1,以便检索两个索引号之间的每个项目。

此构造的语法是 tuple[x:y:z],其中 z 指的是步幅。 让我们创建一个更大的列表,然后对其进行切片,并将步幅值设为 2:

numbers = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

print(numbers[1:11:2])
Output(1, 3, 5, 7, 9)

我们的构造 numbers[1:11:2] 打印包含 1 和不包括 11 的索引号之间的值,然后 2 的步幅值告诉程序只打印输出其他所有项目。

我们可以省略前两个参数,单独使用 stride 作为参数,语法为 tuple[::z]

print(numbers[::3])
Output(0, 3, 6, 9, 12)

通过打印元组 numbers 并将步幅设置为 3,只打印每三个项目:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, [X74X ]12

切片具有正负索引号并指示步幅的元组为我们提供了控制来接收我们试图实现的输出。

连接和相乘元组

Operators 可用于连接或相乘元组。 使用 + 运算符完成连接,使用 * 运算符完成乘法。

+ 运算符可用于将两个或多个元组连接在一起。 我们可以将两个现有元组的值分配给一个新元组:

coral = ('blue coral', 'staghorn coral', 'pillar coral', 'elkhorn coral')
kelp = ('wakame', 'alaria', 'deep-sea tangle', 'macrocystis')

coral_kelp = (coral + kelp)

print(coral_kelp)
Output('blue coral', 'staghorn coral', 'pillar coral', 'elkhorn coral', 'wakame', 'alaria', 'deep-sea tangle', 'macrocystis')

因为 + 运算符可以连接,它可以用来组合元组以形成一个新的元组,但它不能修改现有的元组。

* 运算符可用于将元组相乘。 也许您需要将目录中的所有文件复制到服务器上或与朋友共享播放列表——在这些情况下,您需要增加数据集合。

让我们将 coral 元组乘以 2,将 kelp 元组乘以 3,然后将它们分配给新的元组:

multiplied_coral = coral * 2
multiplied_kelp = kelp * 3

print(multiplied_coral)
print(multiplied_kelp)
Output('blue coral', 'staghorn coral', 'pillar coral', 'elkhorn coral', 'blue coral', 'staghorn coral', 'pillar coral', 'elkhorn coral')
('wakame', 'alaria', 'deep-sea tangle', 'macrocystis', 'wakame', 'alaria', 'deep-sea tangle', 'macrocystis', 'wakame', 'alaria', 'deep-sea tangle', 'macrocystis')

通过使用 * 运算符,我们可以按照我们指定的次数复制我们的元组,根据原始数据序列创建新的元组。

通过使用 +* 运算符,可以将现有的元组连接或相乘以形成新的元组。

元组函数

有一些内置函数可用于处理元组。 让我们来看看其中的几个。

len()

与字符串和列表一样,我们可以使用 len() 计算元组的长度,其中我们将元组作为参数传递,如下所示:

len(coral)

例如,当您需要强制最小或最大集合长度或比较排序数据时,此功能很有用。

如果我们打印出元组 kelpnumbers 的长度,我们将收到以下输出:

print(len(kelp))
print(len(numbers))
Output4
13

我们收到上述输出是因为元组 kelp 有 4 个项目:

kelp = ('wakame', 'alaria', 'deep-sea tangle', 'macrocystis')

元组 numbers 有 13 项:

numbers = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

尽管这些示例的项目相对较少,但 len() 函数为我们提供了查看大型元组中有多少项目的机会。

最大值()和最小值()

当我们处理由数字项组成的元组时(包括 integersfloats),我们可以使用 max()min() 函数来找到最高的以及相应元组中包含的最低值。

这些功能使我们能够找到有关定量数据的信息,例如考试成绩、温度、价格等。

让我们看一个由浮点数组成的元组:

more_numbers = (11.13, 34.87, 95.59, 82.49, 42.73, 11.12, 95.57)

为了得到 max(),我们将元组传递给函数,如 max(more_numbers)。 我们将把它与 print() 函数结合起来,这样我们就可以输出我们的结果:

print(max(more_numbers))
Output95.59

max() 函数返回我们元组中的最大值。

同样,我们可以使用 min() 函数:

print(min(more_numbers))
Output11.12

在这里,在元组中找到了最小的浮点数并打印出来。

就像 len() 函数一样,max()min() 函数在处理包含许多值的元组时非常有用。

元组与列表有何不同

元组与列表的主要不同之处在于它们不能被修改。 这意味着不能在元组中添加或删除项目,也不能在元组中替换项目。

但是,您可以 连接 2 个或更多元组以形成一个新元组。

让我们考虑一下我们的 coral 元组:

coral = ('blue coral', 'staghorn coral', 'pillar coral', 'elkhorn coral')

假设我们想用另一个名为 'black coral' 的项目替换项目 'blue coral'。 如果我们尝试以与列表相同的方式更改该输出,请键入:

coral[0] = 'black coral'

我们将收到一个错误作为我们的输出:

OutputTypeError: 'tuple' object does not support item assignment

这是因为元组不能被修改。

如果我们创建一个元组并确定我们真正需要的是一个列表,我们可以将它转换为一个列表。 要将元组转换为列表,我们可以使用 list()

list(coral)

现在,我们的 coral 数据类型将是一个列表:

coral = ['blue coral', 'staghorn coral', 'pillar coral']

我们可以看到元组被转换为列表,因为括号变成了方括号。

同样,我们可以使用 tuple() 将列表转换为元组。

您可以通过阅读“如何在 Python 3 中转换数据类型”来了解有关数据类型转换的更多信息。

结论

tuple 数据类型是一个无法修改的序列 数据类型,它通过比 Python 处理的列表更快的类型为您的程序提供优化。 当其他人在您的代码上与您协作时,您对元组的使用将向他们传达您不打算修改这些值序列。

本教程介绍了元组的基本特性,包括索引、切片和连接元组,并展示了可用的内置函数。