元组概述

元组是不可变序列,通常用一对小括号包围元素,元素之间逗号隔开。元组的元素可以是任何对象。元组类型是 tuple:

type((1,2,['1','2']))
tuple

空元组用一对圆括号表示:

()
()

单元组后面必须有一个逗号:

(1,)
(1,)

除了空元组,括号可以省略,因为决定生成元组的其实是逗号而不是圆括号,圆括号是可选的,但元组是更大的表达式的一部分或会产生语法歧义的情况,括号不能省略:

1,
(1,)
1, 1+1, ('单元组',)
(1, 2, ('单元组',))

内置函数 tuple() 用来构造元组:

tuple(), tuple('123')
((), ('1', '2', '3'))

当元组中包含可变对象(例如列表)时,元组本身不可变(不能增、删、改元组本身的元素),但包含的可变对象仍然具有它的可变性质及其操作,此时的元组不能再作为集合的元素或字典的键:

a = ([1,2],3,3)
print(id(a))
del a[0][:]
id(a), a
2207053762176


(2207053762176, ([], 3, 3))
{a}
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-14-29dfa031a339> in <module>
----> 1 {a}


TypeError: unhashable type: 'list'

tuple.count 统计元素出现次数

元组方法 tuple.count(),Python 官方文档描述如下:

help(tuple.count)
Help on method_descriptor:

count(self, value, /)
    Return number of occurrences of value.

返回值为 value 的元素在元组中的出现次数。

(1,2,1,3).count(1)
2
(1,2,1,3).count(4)
0

tuple.index 查找元素索引

元组方法 tuple.index(),Python 官方文档描述如下:

help(tuple.index)
Help on method_descriptor:

index(self, value, start=0, stop=9223372036854775807, /)
    Return first index of value.
    
    Raises ValueError if the value is not present.

返回列表中第一个值为 value 的元素从零开始的索引。如果没有这样的元素将会抛出 ValueError 异常。

可选参数 start 和 stop 是切片符号,用于将搜索限制为元组的特定子序列。返回的是相对于整个序列开始计算的索引,而不是相对于 start 参数。

(1,2,3,4,1).index(1)
0
(1,2,3,4,1).index(1,1)
4
(1,2,3,4,1).index(1,1,3)
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-4-c6a812394eea> in <module>
----> 1 (1,2,3,4,1).index(1,1,3)


ValueError: tuple.index(x): x not in tuple

元组操作符

元组可以使用 + 拼接,拼接后按原来的顺序排列:

(4,5,6) + (1,2,3)
(4, 5, 6, 1, 2, 3)
1,2,3 + 4,5,6
(1, 2, 7, 5, 6)

+ 操作符可以与 = 连用,拼接同时赋值,元组是不可变的,该操作是创建了一个新元组:

a = 1,2,3
print(id(a))
a += 4,5,6
id(a), a
2741588191344


(2741587773864, (1, 2, 3, 4, 5, 6))

元组还可使用 * 进行 n 次重复拼接:

(1,)*3
(1, 1, 1)

当 n 小于 1 时,得到空元组:

(1,2,3)*0
()

元组中的元素如果是可变对象,* 重复拼接后,可变对象的性质同 列表操作符 知识点一样,仍然是同一个对象的多次引用:

a = ([],)
b = a*3
# 在元组 a 的第一个元素中加入 1
a[0].append(1)
b
([1], [1], [1])

同列表一样可以用 *=,重复拼接并赋值:

a = 1,
a *= 3
a
(1, 1, 1)

元组是可迭代对象,所以可以用 * 将元组拆包:

{*(1,1,2,3)}
{1, 2, 3}