和列表类似,元组(tuple)也是由一系列按特定顺序排列的元素组成的一种复合数据类型。
在某些特定的情境下,元组和列表的区别并没有那么明显。
元组的初始化
元组的基本格式
在Python中,列表通常用小括号(())表示,并且用逗号将其中的元素分隔开。基本语法为
# 元组名 = (元素, 元素, 元素, ..., 元素)
students_tuple = ("xiaoming", "xiaohong", "xiaohei", 'xiaogang')
print(students_tuple)
输出:
('xiaoming', 'xiaohong', 'xiaohei', 'xiaogang')
注意到,上述代码中的变量名students_tuple用下划线_将单次students和tuple进行连接,这样就很容易能够看出这个变量的类型是一个元组而非一个列表。这是一种良好的编码习惯。
需要注意的是,如果我们想要用上述方式初始化一个只包含一个元素的元组时,需要用下面的方式进行。
元组名 = (元素,)
如:
PI = (3.14159,)
print(PI)
输出:
(3.14159,)
而以下的代码是无法实现我们的目的的。
PI = (3.14159)
print(PI)
输出:
3.14159
仔细对比前后代码,我们会发现如果使用PI = (3.14159)这样的方式进行初始化的话,这一对括号会被编译器认为是数字运算中用于表达运算优先级的括号,而不会被认为是元组的括号。
如果想要初始化一个只包含一个元素的元组,那么必须使用在括号中带上一个逗号,如PI = (3.14159,)
空元组的初始化
如果想初始化一个空元组,一般有两种方式可以实现。其基本语法为
元组名 = ()
元组名 = tuple()
如
tuple1 = ()
tuple2 = tuple()
print(tuple1, tuple2)
输出:
() ()
需要注意的是,其实大部分时候我们并不会使用到空元组。
上述内容只是作为一个初学者的示例进行讲解。
元组的索引和切片
索引
类似列表,元组同样属于有序的复合数据类型,所以元组同样支持索引操作。其基本语法为
所取的元素 = 元组[索引值]
切片
字符串,列表和元组均属于有序的数据类型。
列表的切片操作对元组同样适用,只是得到的切片结果是一个元组而非一个列表。比如
tup = (1, 3, 5, 7, 9, 11)
sub_tup = tup[1:4]
print(sub_tup)
输出:
(3, 5, 7)
元组的增删改
元组是不可变数据类型
当我们想用类似于列表的方式去修改元组中的元素的时候,会发现行不通。譬如
students_tuple = ("xiaoming", "xiaohong", "xiaohei", 'xiaogang')
students_tuple[1] = "xiaomei"
print(students_tuple)
会出现TypeError类型错误的报错
TypeError: ‘tuple’ object does not support item assignment
这是因为元组和字符串类似,都属于不可变数据类型。
我们无法直接通过索引,对元组中的元素进行修改。
将元组和列表的相互转化
虽然我们不能直接对元组本身进行修改,但既然元组和列表的结构和形式如此相似,那么很容易想到,我们可以将元组转换为列表,对转化后的列表进行修改,再将修改后的列表转换回元组。
将元组转化为列表的其基本语法为
列表名 = list(元组名)
类似的,将列表转换为元组的其基本语法为
元组名 = tuple(列表名)
比如我们想把students_tuple元组中索引为1的元素修改为"xiaomei",我们可以先将students_tuple元组转化为students列表,修改后再转换回元组。其代码如下
students_tuple = ("xiaoming", "xiaohong", "xiaohei", 'xiaogang')
students = list(students_tuple)
students[1] = "xiaomei"
students_tuple = tuple(students)
print(students_tuple)
输出:
(‘xiaoming’, ‘xiaomei’, ‘xiaohei’, ‘xiaogang’)
如果想增加或删除元组中的元素,也是通过类似的操作来完成。
相比于列表,元组是更简单的数据结构。
如果需要存储的一组元素在程序的整个生命周期内都不变,可使用元组代替列表来储存数据。