
4.3 元组
元组(Tuple)是Python中另一种内置的存储有序数据的结构。元组与列表类似,也是由一系列按特定顺序排列的元素组成,可存储不同类型的数据,如字符串、数字甚至元组。然而,元组是不可改变的,创建后不能再做任何修改操作。
在形式上,元组的所有元素都放在一对“()”中,两个相邻元素间使用逗号“,”分隔。在内容上,可以将整数、实数、字符串、列表、元组等任何类型的内容放入元组中,并且同一个元组中,元素的类型可以不同,因为它们之间没有任何关系。
因此,元组也被称为不可变的列表。元组的主要作用是作为参数传递给函数调用,或者在从函数调用那里获得参数时,保护其内容不被外部接口修改。通常情况下,元组用于保存程序中不可修改的内容。
4.3.1 元组的创建与删除
1.使用赋值运算符直接创建元组
使用赋值运算符直接将一个元组赋值给变量。具体的语法格式如下。

其中,tuplename表示元组的名称,可以是任何符合Python命名规则的标识符;元素1、元素2、元素3、元素n表示元组中的元素,个数没有限制,并且只要是Python支持的数据类型就可以。例如:studentname=(“高晓萌”,“见福先”,“郑熙婷”,“李丹丹”,“尚天翔”)。
创建元组的语法与创建列表的语法类似,只是创建列表时使用的是“[]”,而创建元组时使用的是“()”。
在Python中,虽然元组是使用一对小括号将所有的元素括起来。但是实际上,小括号并不是必需的,只要将一组值用逗号分隔开来,Python就可以认为它是元组。例如:studentname=“高晓萌”,“见福先”,“郑熙婷”,“李丹丹”,“尚天翔”。
如果要创建的元组只包括一个元素,则需要在定义元组时,在元素的后面加一个逗号“,”。例如:studentname=(“高晓萌”,)。
在Python中,可以使用type函数测试变量的类型。
2.创建空元组
在Python中,也可以创建空元组,空元组可以应用在为函数传递一个空值或者返回空值时。例如,创建一个名称为emptytuple的空元组:emptytuple=()。
3.创建数值元组
在Python中,可以使用tuple函数直接将range函数循环出来的结果转换为数值元组。
tuple函数的语法格式如下:tuple(data)。
其中,data表示可以转换为元组的数据,其类型可以是range对象、字符串、元组或者其他可迭代类型的数据。例如,创建一个10~20(不包括20)中所有偶数的元组,tuple(range(10,20,2))。
4.删除元组
元组中的元素值是不允许删除的,但可以使用del语句来删除整个元组。对于已经创建的元组,不再使用时,可以使用del语句将其删除。
语法格式:del tuplename。
其中,tuplename为要删除元组的名称。
del语句在实际开发时并不常用。因为Python自带的垃圾回收机制会自动销毁不用的元组,所以即使不手动将其删除,Python也会自动将其回收。
5.整体修改元组元素
元组是不可变序列,所以不能对它的单个元素值进行修改。但是元组也不是完全不能修改,可以对元组进行重新赋值。
元组之间可以使用+和*,即允许元组进行组合连接和重复复制,运算后会生成一个新的元组。
【例4-32】 整体修改元组元素。

运行结果:('古巴比伦','古埃及','古印度','中国','古希腊')。
另外,还可以对元组进行连接组合。在进行元组连接时,连接的内容必须都是元组。不能将元组和字符串或者列表进行连接。
在进行元组连接时,如果要连接的元组只有一个元素时,一定不要忘记后面的逗号。元组内的数据如果直接修改则会立即报错,但是如果元组里面有列表,修改列表里面的数据则是可以的。
4.3.2 元组的常见操作
元组数据不支持修改,但支持查找。接下来,介绍元组的查找操作。对元组进行查找操作的内建函数包括以下四种。
1)len(tup):返回元组中元素的个数。
2)max(tup):返回元组中元素最大的值。
3)min(tup):返回元组中元素最小的值。
4)tuple(seq):将列表转化为元组。
在Python中,如果想将元组的内容输出也比较简单,可以直接使用print函数即可。
【例4-33】 元组元素的整体输出。

运行结果:('高晓萌',28,['高铁','扫码支付','共享单车','网购'])。
从上面的执行结果中可以看出,在输出元组时,是包括左右两侧的小括号的。如果不想输出全部元素,也可以通过元组的索引获取指定的元素。
【例4-34】 要获取元组modern中索引为0的元素。

运行结果:高晓萌。
从上面的执行结果中可以看出,在输出单个元组元素时,不包括小括号,如果是字符串,则不包括左右的引号。
另外,对于元组也可以采用切片方式获取指定的元素。
【例4-35】 要访问元组modern中前两个元素。

运行结果:('高晓萌',28)。
同列表一样,元组可以使用for循环进行遍历,也可以使用for循环和enumerate函数结合进行遍历。
【例4-36】 使用for循环和enumerate函数枚举元组元素。

运行结果:

可使用index()方法查找元组中的某个数据,如果数据存在则返回对应的下标,否则报错,语法和列表、字符串的index()方法相同。
统计某个数据在当前元组出现的次数可用count()方法。
【例4-37】 通过index()方法和count()方法实现对元组元素查找和统计的应用示例。

运行结果:

4.3.3 元组与列表的区别及相互转换
1.元组与列表的区别
元组和列表都属于序列,而且它们又都可以按照特定顺序存放一组元素,类型又不受限制,只要是Python支持的类型都可以。
列表和元组的区别主要体现在以下几个方面。
1)列表属于可变序列,它的元素可以随时修改或者删除;而元组属于不可变序列,其中的元素不可以修改,除非整体替换。
2)列表可以使用append()、extend()、insert()、remove()和pop()等方法实现添加和修改列表元素:而元组则没有这几个方法,因为不能向元组中添加和修改元素,同样也不能删除元素。
3)列表可以使用切片访问和修改列表中的元素;元组也支持切片,但是它只支持通过切片访问元组中的元素,不支持修改。
4)元组比列表的访问和处理速度快。所以如果只需要对其中的元素进行访问,而不进行任何修改,建议使用元组。
5)列表不能作为字典的键,而元组则可以。
2.元组与列表的相互转换
元组与列表可以互相转换,Python内置的tuple函数接收一个列表,可返回一个包含相同元素的元组。而list函数可接收一个元组并返回一个列表。从元组与列表的性质来看,tuple函数相当于冻结一个列表,而list函数相当于解冻一个元组。