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