Python3 中元组表现为如下形式:
![ec5af4c49e0a9913479a849e2ee88d0e.png](https://i-blog.csdnimg.cn/blog_migrate/2c76b92fc9f15eb3c49e5ca4df665fef.png)
元组(tuple)是一种静态的(immutable)或者说是不可变(unchangeable)的数据结构,里面的元素按照一定的顺序排列。它是静态的,所以元组里的元素不能被修改。
元组用于给数据分组。元组中的每一个元素称之为“项”(item)。
元组中的值被包装在括号中,并用逗号分隔,空元组可以写成coral=(),不过只有一项元素的元组必须使用逗号:coral = (“blue coral”,)。
如果使用print()函数打印元组,会得到如下的输出,其中元组依然‘()’用括号包裹。
![9997610f7801e645f6473c3691a32a54.png](https://i-blog.csdnimg.cn/blog_migrate/c21226cba5ada180449e3665eba5a269.png)
当你试图理解Python中的元组或者其他集合类型的数据结构时,去想一下电脑中存在的不同集合是有帮助的:不同类型文件的排列,你的歌曲清单,浏览器中的书签,你的邮箱,你在流媒体上获得的视频集合等等。
元组和列表很像,不过元组中的值是不可修改的。也正因为如此,当你在代码中使用元组时,就意味着告诉他人你不想集合中的数据被修改。同时,因为元组中的值不可变,因此相比于使用列表,你的代码能通过使用元组得到优化。
元组的索引
作为一个有序的元素集合,元组中的任一项都可以通过索引被单独访问。
每一项都与一个索引号相关联,它是一个整数值,从0开始计数。
对于coral元组,它的索引如下所示:
![7944c52a352f793b74b8b9f4946fead3.png](https://i-blog.csdnimg.cn/blog_migrate/db7c2d59636332df4dcf0dd79c879dbb.jpeg)
元组中的第一项,字符串“blue coral”的索引是0,元组的最后一个元素是“elkhorn coral”,索引号是3。
因为元组中的每一项都有一个对应的索引号,因此我们可以单独地访问每一个元素。
现在我们通过索引号单独访问某个元素:
![b5803d205c40c862cb9661a5fa170fa4.png](https://i-blog.csdnimg.cn/blog_migrate/921c965483448e31a8429bcfd29f149c.jpeg)
如上表所示,索引号的范围是0~3,所以我们可以通过索引号去访问其中的每个元素:
![289657496ec7fe77fcf28123a16f74b9.png](https://i-blog.csdnimg.cn/blog_migrate/1eb7c13356614e733b17957b0f99226d.jpeg)
如果我们访问此元组时使用一个超过3的索引号,它会提示说索引号越界。
![2c33b7cecd16a29286e002791576868d.png](https://i-blog.csdnimg.cn/blog_migrate/1031a6b123e74fdb1d1b274b343b2a2b.jpeg)
索引号除了可以是正数,还可以是负数形式,它是从后往前倒着数地,从-1开始。
当我们去具体访问一个长元组的最后几项时,负数形式的索引号很有效。
还是针对coral元组,它的负数形式的索引号如下:
![f1b58d03cea673687978409787573fac.png](https://i-blog.csdnimg.cn/blog_migrate/e39f05d6ec292a7ae5b03069c41ef335.jpeg)
所以如果你想通过负数形式的索引打印出“blue coral”这一项,可以写成如下形式:
![49c91db3ca6d9479b17433981f20fa57.png](https://i-blog.csdnimg.cn/blog_migrate/5094f59bd484ee88d2de6b528ba561c9.jpeg)
我们还可以通过‘+’操作符来将元组中的字符串值和另一个字符串连接:
![c39a1a542a017d485566ca2c6bf67018.png](https://i-blog.csdnimg.cn/blog_migrate/d9aae3efcc085eb59921ce8c1fe09046.png)
我们把索引号为1的元素的值和字符串“This reef is made up of”组合在一起。我们也可以使用‘+’来连接两个或者多个元组。
元组中的每一项都有对应的索引号,我们可以很容易地去访问元组中的每一个元素。
元组的切片
我们使用索引号去访问元组中的某一项。切片(slice)通过构造一个索引号的范围[x:y]可以同时获得元组中的多个值。
假设我们想获取coral元组中间的值,可以用如下方式构造一个切片。
![58cd8c86dae2ce4e109ec856ade1b4d1.png](https://i-blog.csdnimg.cn/blog_migrate/a47415fe9e982b88c7076f716ed42c2e.jpeg)
当我们在构造[1:3]这个切片时,第一个表示切片开始的地方(包含此索引号),第二个数表示切片结束的地方(不包括此索引号),因此[1:3]能够取出索引号为1和2的元素。
如果你想得到除了端点元素的剩余所有元素,你可以在[x:y]中忽略某一项。
如你想打印出coral元组中的前三个元素,你可以写成如下形式:
![5cf46e1f4cb3200170b855a8602cd2fe.png](https://i-blog.csdnimg.cn/blog_migrate/621e1e3f020834742cec4ecb386546fe.png)
这就打印出元组中前面部分的信息,在索引号为3的元素之前停止。
为了打印出元组后面部分的信息,可以忽略掉[x:y]中y的值:
![6a0dd4cd977c224214a86a64d56c2f62.png](https://i-blog.csdnimg.cn/blog_migrate/0141e1cdbaa432394ccddc21aae58d17.png)
我们也可以使用负数形式的索引号构造切片来访问元组:
![1a5a5c2f6c86e869908ad3e2f5fb161b.png](https://i-blog.csdnimg.cn/blog_migrate/8efc1500d3ec09247f0919ae383e9a64.jpeg)
切片中的最后一个变量是步长(stride),它是指当我们取出前一项时,移动多少个元素去取下一个值。
前面的几个例子,我们都忽略了这一变量,使用默认值1。因此我们能够取得两个索引号中间的所有元素。
完整的切片构造方式[x:y:z],z是指步长。我们来构造一个长一点的元组,通过步长为2的切片去访问它:
![de08ee553c9dec33f35d8c5ac6ba1143.png](https://i-blog.csdnimg.cn/blog_migrate/14c5129b74896b17de5bb4021aad91a1.jpeg)
我们构造的切片[1:11:2]打印出从索引号为1(包括此索引号),到索引号为11(不包括此索引号)的值,步长为2告诉我们隔一项打印一个。
我们可以忽略切片中的前两项,只使用步长变量:
![ac0684e114792021194b4bb7bf129e69.png](https://i-blog.csdnimg.cn/blog_migrate/12463c4a4f83ceec581fc9984cf13576.jpeg)
通过把切片中的步长设置为3,每个索引号能够被3整除的元素打印出来:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
通过使用正数或者负数形式的切片,并设置步长,我们可以更加有针对性地获取元组中的值。
元组的连接和复制
操作符可以被用来连接或者复制元组。连接是通过‘+’来完成,复制是‘*’来完成。
‘+’可以将两个或者多个元组连接在一起。我们可以把两个元组中的值合并得到一个新的元组。
![451a0124ea684c5b68c167cd3f6d1e68.png](https://i-blog.csdnimg.cn/blog_migrate/f8538d46637ec8c01a9254072ca6896b.jpeg)
输出结果为:
![96d1ad172758596bbd35c108eed92d41.png](https://i-blog.csdnimg.cn/blog_migrate/4dadc018849857b995c74d33967de06f.png)
因为‘+’操作符可以用来连接,所以可以被用来将多个元组合并成一个新的元组,尽管如此,我们还是不能改变某一个已存在的元组。
‘*’操作符可以用来复制元组,也许你需要将某一目录下的文件全部拷贝到服务器上,或者你想和朋友分享一下播放列表,在这些情况下,你需要复制数据的集合。
让我们把coral元组乘以2,kelp元组乘以3,来创建新的元组。
![28080bee0218b0e2aa524b31c7e3d9f4.png](https://i-blog.csdnimg.cn/blog_migrate/088b0dbbd3e5cc1cbb6bfe3c59e2f7c1.jpeg)
![173d1fa00971bbfaa7966c15bd00739e.png](https://i-blog.csdnimg.cn/blog_migrate/b70f6aa99aff336b7886d7c66fe64033.jpeg)
通过‘*’操作符,我们可以将元组复制指定的次数,通过原有的数据序列去制造新的元组。
现有的元组可以通过‘+’或者‘*’来进行连接或者复制操作。
元组的函数
你可以使用一些内建函数来操作元组。
len()
类似于字符串和列表,我们可以通过len()函数计算元组的长度,把元组作为参数传递进去:
![6c72af22a164c1da09bcf296e5ec953a.png](https://i-blog.csdnimg.cn/blog_migrate/c37d3d49e434aa191fd234baba4ef7f9.png)
当你想得到不同集合长度的最大或最小值时,这个函数非常有用。
当对kelp元组和numbers使用len函数时,我们会得到如下输出:
![ef101807a7bd686df3b9f558dcc6c1b5.png](https://i-blog.csdnimg.cn/blog_migrate/15ae32c8216d9a9f81e081ddfd806a10.jpeg)
我们得到上述输出是因为kelp有四个元素,numbers有13个元素:
![cee0d1419cc56295018230d34406acaf.png](https://i-blog.csdnimg.cn/blog_migrate/d26442d9d98e755c699c7bc1d2ad9150.png)
上述实例中元组的长度比较小,当元组较长时len()可以得到元素的具体数量。
max()和min()
当我们处理数值型的元组时(包括整数和浮点数),我们可以使用max()和min()函数去找到某一特定元组中的最大值和最小值。
这两个函数让我们能够得到定量数据的相关信息,如考试成绩,温度,价格等。
看一下由浮点数组成的元组:
![708e144b685f8495ff5ba82c7fd85993.png](https://i-blog.csdnimg.cn/blog_migrate/c45b36da75733f043f89f80d15655ee6.png)
为了使用max()函数,需要把元组传递进函数,max(more_numbers)。
max()函数能够得到元组中的最大值。
同样地,我们也可以使用min()函数得到最小值。
![a1b65152cacf9f38401821eb67b424fe.png](https://i-blog.csdnimg.cn/blog_migrate/f21f1c115d5654c0019465df27d23bf8.jpeg)
如此我们就能找到并打印出元组中的最小值。
和len()函数一样,当元组中的数据项较多时,max()和min()是很有用的。
元组和列表的不同之处
元组和列表的首要不同之处就是元组中的值不可修改的。这意味着不能在元组中添加或者删除值,某一数据项的值也不能修改。
不过,我们可以通过‘+’等操作符来构造新元组。
让我们再一次操作coral元组,我们想要把数据项‘blue coral’替换成‘black coral’。如果你试图像操作列表那样去操作元组:
![bc9a976e8a2dd79759f4794e6c7d3a9b.png](https://i-blog.csdnimg.cn/blog_migrate/3c4b9e0aee7f123c218af94a11c328e7.png)
它会报错。
这是因为元组的值是不能修改的。
如果构造完一个元组,而后你才发现真正需要的是列表形式,我们可以将其进行转换。
为了把元组转换成列表,我们可以使用list()函数。
![3b81eace06f3200dc52c8b7cd3ba112d.png](https://i-blog.csdnimg.cn/blog_migrate/75bc43bfea5193210050d28cf085b82c.png)
现在我们就把元组转换成用[]包裹的列表了。
同样地,你可以使用tuple()函数将列表转换为元组。
你可以在“在Python3如何转换数据”学到更多相关知识。
总结
元组是一种有序的数据类型,它不能被修改,因其运行速度比列表快,所以使用元组的代码会有一定的优化。当你和其他人共同合作编写代码时,使用元组类型意味着你不想自己的数据序列被修改。
这篇导论阐述了元组的基本特性,包括索引,切片和拼接,同时也介绍了针对元组的内建函数。