元组既能像列表那样同时容纳多种类型的对象,也拥有字符串不可变的特性。
1 元组和列表的不同点
∙ \bullet ∙ 列表是使用方括号,元组则是圆括号(也可以不带圆括号)
>>> tuple = (1, 2, 3, "hello", "world", "中国人")
>>> tuple
(1, 2, 3, 'hello', 'world', '中国人')
>>> tuple = 1, 2, 3, "hello", "world", "中国人"
>>> tuple
(1, 2, 3, 'hello', 'world', '中国人')
>>>
∙ \bullet ∙ 列表中的元素可以被修改,而元组不行
>>> tuple = (1, 2, 3, "hello", "world", "中国人")
>>> tuple[0] = 0
Traceback (most recent call last):
File "<pyshell#154>", line 1, in <module>
tuple[0] = 0
TypeError: 'tuple' object does not support item assignment
>>>
∙ \bullet ∙ 列表中涉及到修改元素的方法(增、删、改)元组均不支持
∙ \bullet ∙ 列表的推导式叫列表推导式,元组的 “推导式” 叫生成器表达式
>>> tuple = (1, 2, 3, 4, 5)
>>> [each * 2 for each in tuple]
[2, 4, 6, 8, 10]
>>> (each * 2 for each in tuple)
<generator object <genexpr> at 0x0000022C591D20B0>
>>>
2 元组和列表的相同点
∙ \bullet ∙ 都可以通过下标获取元素
>>> tuple = (1, 2, 3, "hello", "world", "中国人")
>>> tuple[0]
1
>>> tuple[5]
'中国人'
>>> tuple[-1]
'中国人'
>>>
∙ \bullet ∙ 都支持切片操作,因为切片的含义是将目标对象中的元素以某种特定的组合导出,而非修改对象本身。
>>> tuple = (1, 2, 3, "hello", "world", "中国人")
>>> tuple[:3]
(1, 2, 3)
>>> tuple[3:]
('hello', 'world', '中国人')
>>> tuple[:]
(1, 2, 3, 'hello', 'world', '中国人')
>>> tuple[::2]
(1, 3, 'world')
>>> tuple[::-1]
('中国人', 'world', 'hello', 3, 2, 1)
>>>
∙ \bullet ∙ 都支持 count() 方法和 index() 方法
>>> tuple = (3, 1, 9, 6, 8, 3, 5, 3)
>>> tuple.count(3)
3
>>> tuple = (1, 2, 3, "hello", "world", "中国人")
>>> tuple.index("hello")
3
>>>
∙ \bullet ∙ 都支持拼接(+)和重复(*)运算符
>>> tuple1 = (1, 2, 3)
>>> tuple2 = (4, 5, 6)
>>> tuple1 + tuple2
(1, 2, 3, 4, 5, 6)
>>> tuple1 * 3
(1, 2, 3, 1, 2, 3, 1, 2, 3)
>>>
∙ \bullet ∙ 都支持嵌套
>>> tuple1 = (1, 2, 3)
>>> tuple2 = (4, 5, 6)
>>> tuple = tuple1, tuple2
>>> tuple
((1, 2, 3), (4, 5, 6))
>>>
∙ \bullet ∙ 都支持迭代
>>> tuple = ((1, 2, 3), (4, 5, 6))
>>> for i in tuple:
for each in i:
print(each)
1
2
3
4
5
6
>>>
3 生成一个元素的元组
当元组只有一个元素的时候,不要这么写:
>>> x = (520)
>>> type(x)
<class 'int'>
>>>
而应该这么写:
>>> x = (520,)
>>> x
(520,)
>>> type(x)
<class 'tuple'>
>>>
或者这么写:
>>> x = 520,
>>> x
(520,)
>>> type(x)
<class 'tuple'>
>>>
4 打包和解包
生成一个元组我们有时候也称之为元组的打包:
>>> tuple = (1, 2, 3, "hello", "world")
>>> tuple
(1, 2, 3, 'hello', 'world')
>>>
将它们一次性赋值给五个变量名的行为,我们称之为解包:
>>> tuple = (1, 2, 3, "hello", "world")
>>> a, b, c, d, e = tuple
>>> a
1
>>> b
2
>>> c
3
>>> d
'hello'
>>> e
'world'
>>>
列表也可以进行解包操作:
>>> list = [1, 2, 3, "hello", "world"]
>>> a, b, c, d, e = list
>>> a
1
>>> b
2
>>> c
3
>>> d
'hello'
>>> e
'world'
>>>
字符串也可以进行解包操作:
>>> string = "hello"
>>> a, b, c, d, e = string
>>> a
'h'
>>> b
'e'
>>> c
'l'
>>> d
'l'
>>> e
'o'
>>>
需要注意的一点是:不管是哪种序列的解包操作,赋值号左侧的变量名数量,必须跟右侧序列的元素数量一致,否则通常都会报错。有一种特例,可以进行如下操作:
>>> tuple = (1, 2, 3, "hello", "world")
>>> a, b, *c = tuple
>>> a
1
>>> b
2
>>> c
[3, 'hello', 'world']
>>>
5 多重赋值
>>> x, y = 10, 20
>>> x
10
>>> y
20
>>>
上述多重赋值的背后实现逻辑就是先通过元组进行打包,然后再将元组进行解包:
>>> _ = (10, 20)
>>> x, y = _
>>> x
10
>>> y
20
>>>
6 如何对元组进行修改
在前面已经介绍过元组中的元素是不可以修改的,但是也有一种特殊情况,如下例子:
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> c = (a, b)
>>> c
([1, 2, 3], [4, 5, 6])
>>> c[0][0] = 0
>>> c
([0, 2, 3], [4, 5, 6])
>>>
在上述例子中,首先申明了两个列表,然后把这两个列表放进一个元组,于是这两个列表就成为了元组c的两个元素,在这种情况下,元组就变成可以修改的了。也就是说,元组中的元素是不可以变的,但是当元组中的元素是指向一个可变的列表,那此时就可以修改该列表,从而达到修改元组的目的。