元组(tuple)与列表类似,也是一种序列数据类型。
元组是不可变类型,其元素不能修改。
元组中的元素是有序可重复的
元组中元素类型可以不相同。
元组写在小括号 ( )
里,元素之间用逗号 ,
隔开。
创建元组
>>> tup = ('Google', 'Neuedu', 2019, True)
>>> tup
('Google', 'Neuedu', 2019, True)
>>> type(tup)
<class 'tuple'>
- 创建空元组
>>> tup1 = ()
>>> tup1
()
- 创建只有一个元素的元组时,需要在元素后面添加逗号,否则括号会被当作运算符使用
>>> tup1 = (50)
>>> type(tup1) # 不加逗号,类型为整型
<class 'int'>
>>> tup1 = (50,)
>>> type(tup1) # 加上逗号,类型为元组
<class 'tuple'>
使用元组
- 与列表类似,元组可以使用下标索引来访问元组中的值
元组变量 [ 索引值 ]
>>> tup1 = ('Google', 'Neuedu', 1997, 2000)
>>> tup1[1])
'Neuedu'
- 元组同样可以被截取、连接、重复,运算后会生成新的元组
元组变量 [ 头下标:尾下标 ]
tuple = ( 'abcd', 786 , 2.23, 'neuedu', 70.2 )
tinytuple = (123, 'neuedu')
print (tuple) # 输出完整元组
print (tuple[0]) # 输出元组的第1个元素
print (tuple[1:3]) # 输出从第2个到第3个元素
print (tuple[2:]) # 输出从第3个元素开始的所有元素
print (tinytuple * 2) # 输出两次元组
print (tuple + tinytuple) # 连接元组
('abcd', 786, 2.23, 'neuedu', 70.2)
abcd
(786, 2.23)
(2.23, 'neuedu', 70.2)
(123, 'neuedu', 123, 'neuedu')
('abcd', 786, 2.23, 'neuedu', 70.2, 123, 'neuedu')
修改元组
- 元组中的元素值是不允许修改的。
>>> tup = (1, 2, 3, 4, 5, 6)
>>> tup[0] = 11 # 修改元组元素的操作是非法的
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
- 虽然元素值是不允许修改的,但我们可以对元组进行连接组合
tup1 = (12, 34.56);
tup2 = ('abc', 'xyz')
tup3 = tup1 + tup2; # 创建一个新的元组
print (tup3)
(12, 34.56, 'abc', 'xyz')
- 元组中可以包含可变的对象,比如列表,但通常不这样做
>>> tup = ([1,2,3,4])
>>> type(tup)
<class 'list'>
>>> tup = ([1,2,3,4],)
>>> type(tup)
<class 'tuple'>
>>> tup[0]
[1, 2, 3, 4]
>>> tup[0][1]
2
>>> tup[0] = [11,22,33]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> tup[0][1] = 222
>>> tup[0][1]
222
- 思考下列代码中,元组的内容为什么可以改变
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])
-
原因:
定义的时候tuple包含的3个元素:
当我们把list的元素'A'
和'B'
修改为'X'
和'Y'
后,tuple变为:
- 表面上看,
tuple
的元素确实变了,但其实变的不是tuple
的元素,而是list
的元素。tuple
一开始指向的list
并没有改成别的list
。tuple
所谓的“不变”是说,tuple
的每个元素,指向永远不变。即指向'a'
,就不能改成指向'b'
,指向一个list
,就不能改成指向其他对象,但指向的这个list
本身是可变的!
理解了“指向不变”后,要创建一个内容也不变的tuple怎么做?那就必须保证tuple的每一个元素本身也不能变。
删除元组
- 元组中的元素值是不允许删除的,但我们可以使用
del
语句来删除整个元组
>>> tup = ('Google', 'Neuedu', 1997, 2000)
>>> del tup
>>> tup
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'tup' is not defined
元组运算符
表达式 | 结果 | 描述 |
---|---|---|
len((1, 2, 3)) | 3 | 计算元素个数 |
(1, 2, 3) + (4, 5, 6) | (1, 2, 3, 4, 5, 6) | 连接 |
('Hi!',) * 4 | ('Hi!', 'Hi!', 'Hi!', 'Hi!') | 复制 |
3 in (1, 2, 3) | True | 元素是否存在 |
for x in (1, 2, 3): print (x,) | 1 2 3 | 迭代 |
元组函数
函数 | 作用 |
---|---|
len(tuple) |
获得元组元素个数 |
max(tuple) |
返回元组元素最大值 |
min(tuple) |
返回元组元素最小值 |
tuple(seq) |
将列表转换为元组 |
>>> tuple1 = ('Google', 'Neuedu', 'Taobao')
>>> len(tuple1)
3
>>> tuple2 = ('5', '4', '8')
>>> max(tuple2)
'8'
>>> tuple2 = ('5', '4', '8')
>>> min(tuple2)
'4'
>>> list1= ['Google', 'Taobao', 'Neuedu', 'Baidu']
>>> tuple1=tuple(list1)
>>> tuple1
('Google', 'Taobao', 'Neuedu', 'Baidu')
- end -