元组概述
元组是不可变序列,通常用一对小括号包围元素,元素之间逗号隔开。元组的元素可以是任何对象。元组类型是 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}