上一篇:学好Python列表的所有用法,这一篇看完就够了(万字长文♥记得收藏哦♥)
元组(tuple)是 Python 中另一个重要的序列结构,与列表类似,也是由一系列按特定顺序排列的元素组成,但是它是不可变序列。因此,元组也可以称为不可变的列表。在形式上,元组的所有元素都放在一对 “()” 中,两个相邻的元素间使用 “,” 分隔。在内容上,可以将整数、实数、字符串、列表、元组等任何类型的内容放入到元组中,并且在同一个元组中,元素的类型可以不同,因为它们之间没有任何关系。通常情况下,元组用于保存程序中不可修改的内容。
在 Python 中提供了多种创建元组的方法,下面分别进行介绍。
同其他类型的 Python 变量一样,创建元组时,也可以使用赋值运算符 “=” 直接将一个元组赋值给变量。语法格式如下:
tuplename = (element_1, element_2, element_3, ..., element_n)
其中,tuplename 表示元组的名称,可以是任何符合 Python 命名规则的标识符;element_1, element_2, element_3, element_n 表示元组中的元素,个数没有限制,并且只要为 Python 支持的数据类型就可以。
注意:创建元组的语法与创建列表的语法类似,只是创建列表时使用的是 “[]”,而创建元组时使用的是 “()”。
例如,下面定义的都是合法的元组:
name = ('爬虫', '游戏开发', '大数据', '人工智能')
num = (34, 27.1, 7.83, 64, 90, 17)
a = ('草莓', 20, ('葡萄', '榴莲'), ['土豆', '西红柿', '黄瓜'])
在 Python 中,元组使用一对小括号将所有的元素括起来,但是小括号并不是必须的,只要将一组值用逗号隔开来,Python 就可以视其为元组。例如下面代码定义的也是元组:
fruits = '火龙果', '山竹', '车厘子', '桃子'
print(fruits)
print(type(fruits))
上面代码中使用了 type() 函数来判断 fruits 序列类型,运行结果如下:
('火龙果', '山竹', '车厘子', '桃子')
<class 'tuple'>
可以看到结果为 ‘tuple’ ,就是元组类型。但规范起见,还是要加括号。如果要创建的元组只包括一个元素,则需要在定义元组时,在元素的后面加一个逗号 “,”。例如下面的代码定义的就是包括一个元素的元组:
a = ('沧海月明珠有泪',)
print(a)
代码运行后,结果如下:
('沧海月明珠有泪',)
如果一个元素不加 “,”,则类型为该元素原本类型,如下代码所示:
a = ('沧海月明珠有泪')
b = (18)
print(a)
print(type(a))
print(b)
print(type(b))
运行之后结果如下:
沧海月明珠有泪
<class 'str'>
18
<class 'int'>
在 Python 中,也可以创建空元组,例如,创建一个名称为 empty 的空元组,可以使用下面代码:
empty = ()
空元组可以应用在为函数传递一个空值或者返回空值时。例如,定义一个函数必须传递一个元组类型的值,但还不想为它传递一组数据,那么就可以创建一个空元组传递给它。
在 Python 中,可以使用 tuple() 函数直接将 range() 函数循环出来的结果转换为数值元组。
tuple() 函数的基本语法如下:
tuple(data)
其中,data 表示可以转换为元组的数据,其类型可以是 range() 对象、字符串、元组或者其他可迭代类型的数据。
例如,创建一个 1~10 之间所有奇数的元组,可以使用下面的代码:
num = tuple(range(1, 10, 2))
print(num)
运行上面代码后,将得到下面的元组:
(1, 3, 5, 7, 9)
说明:使用 tuple() 函数不仅能通过 range 对象创建元组,还可以通过其他对象创建元组。
对于已经创建的元组,不再使用时,可以使用 del 语句将其删除。语法格式如下:
del tuplename
其中,tuplename 为要删除的元组名称。
说明:del 语句在实际开发时,并不常用。因为 Python 自带的垃圾回收机制会自动销毁不用的元组,所以即使我们不手动将其删除,Python 也会自动将其回收。
例如,定义一个名称为 scenic_spots 的元组,然后应用 del 语句将其删除。可以使用下面代码:
scenic_spots = ('玉龙雪山', '丽江古城', '西双版纳热带植物园')
del scenic_spots
print(scenic_spots)
代码运行之后会报错,因为已经删除了 scenic_spots 元组,再打印的话会显示未定义该名称,如下图所示:
在 Python 中,如果想将元组的内容输出也比较简单,可以直接使用 print() 函数即可。例如下面代码所示:
scenic_spots = ('玉龙雪山', '丽江古城', '西双版纳热带植物园')
print(scenic_spots)
执行结果如下:
('玉龙雪山', '丽江古城', '西双版纳热带植物园')
从上面执行结果中可以看出,在输出元组时,是包括左右两侧的小括号的。如果不想要输出全部的元素,也可以通过元组的索引获取指定的元素。例如,要获取元组 scenic_spots 中索引为 1 的元素,可以使用如下代码:
scenic_spots = ('玉龙雪山', '丽江古城', '西双版纳热带植物园')
print(scenic_spots[1])
代码执行结果如下:
丽江古城
从结果中可以看出,在输出单个元素时,不包括小括号,如果是字符串,还不包括左右的引号。
另外,对于元组也可以采用切片方式获取指定范围的元素。例如,要访问元组 foods 中前 4 个元素,可以使用下面代码:
foods = ('noodles', 'dumplings', 'rices', 'cakes', 'steaks')
print(foods[:4])
代码执行结果如下:
('noodles', 'dumplings', 'rices', 'cakes')
同列表一样,元组也可以使用 for 循环进行遍历。比如下图代码所示:
另外,元组还可以使用 for 循环和 enumerate() 函数结合进行访问。例如,通过 for 循环和 enumerate() 函数遍历输出【2022年中国大学排名】前十名的名次和大学名称。代码如下:
universities = ('清华大学', '北京大学', '浙江大学', '上海交通大学',
'复旦大学', '南京大学', '中国科学技术大学',
'华中科技大学', '武汉大学', '西安交通大学')
for index, university in enumerate(universities):
print(index + 1, university)
运行上面代码,结果显示如下:
1 清华大学
2 北京大学
3 浙江大学
4 上海交通大学
5 复旦大学
6 南京大学
7 中国科学技术大学
8 华中科技大学
9 武汉大学
10 西安交通大学
说明:enumerate() 函数用于将一个可遍历的数据对象(如列表或元组)组合为一个索引序列,同时列出元素和元素下标,一般在 for 循环中使用。
元组是不可变序列,所以我们不能对它的单个元素值进行修改。但是元组也不是完全不能修改。我们可以对元组进行重新赋值。例如,下面的代码是允许的:
universities = ('清华大学', '北京大学', '浙江大学', '上海交通大学',
'复旦大学', '南京大学', '中国科学技术大学',
'华中科技大学', '武汉大学', '西安交通大学')
universities = ('清华大学', '北京大学', '浙江大学')
print('新的元组', universities)
代码执行结果如下:
新的元组 ('清华大学', '北京大学', '浙江大学')
从上面执行结果可以看出,元组 universities 的值已经改变。
另外,还可以对元组进行连接组合。例如,可以使用下面的代码实现在已经存在的元组结尾处添加一个新元组。
universities = ('清华大学', '北京大学', '浙江大学')
print('原元组:', universities)
universities = universities + ('中国科学技术大学', '上海交通大学', '南京大学')
print('组合后的元组:', universities)
执行结果如下:
原元组: ('清华大学', '北京大学', '浙江大学')
组合后的元组: ('清华大学', '北京大学', '浙江大学', '中国科学技术大学', '上海交通大学', '南京大学')
注意:在进行元组连接时,连接的双方必须都是元组。不能将元组和字符串或者列表进行连接,否则会报错。
使用元组推导式可以快速生成一个元组,它的表现形式和列表推导式类似,只是将列表推导式中的 “[ ]” 修改为 :“( )”。例如,可以通过如下代码生成一个包含 5 个范围在 0~20 的随机数的元组。
import random
num = (random.randint(0, 20) for i in range(5))
print(num)
代码执行结果如下:
<generator object <genexpr> at 0x0000024E6EED9E40>
从上面执行结果中可以看出,使用元组推导式生成的结果并不是一个元组或者列表,而是一个生成器对象,这一点和列表推导式是不同的。要使用生成器对象的话,可以将其转换为元组或者列表。其中,转换为元组使用 tuple() 函数,而转换为列表则使用 list() 函数。
例如,使用元组推导式生成一个包含 5 个范围在 0~20 的随机数的元组,然后将其转换为元组输出。可以使用如下代码:
import random
num = (random.randint(0, 20) for i in range(5))
print(tuple(num))
执行结果如下:
(11, 7, 1, 5, 4)
要使用通过元组推导式生成的生成器对象,还可以直接通过 for 循环遍历的方法进行遍历输出元素。以刚才随机数代码为例,通过 for 循环输出生成器的所有元素,代码如下:
import random
num = (random.randint(0, 20) for i in range(5))
print(num) # 生成器对象
for i in num:
print(i)
上面代码运行后显示如下结果:
<generator object <genexpr> at 0x0000020CE6B69E40>
13
1
11
4
0
元组和列表都属于序列,而且它们都可以按照特定顺序存放一组元素,存放元素的类型又不受限制,只要是 Python 支持的类型都可以。那么它们之间有什么区别呢?
列表类似于我们用铅笔在纸上写下自己喜欢的格言,写错了还可以擦掉;而元组则类似于用钢笔写下的格言,写错了就擦不掉了,除非换一张纸重写。
列表和元组的区别主要体现在以下几个方面:
以上就是跟大家分享的元组所有知识,元组当中创建、访问以及遍历非常重要,是开发的基本功;元组推导式中的生成器对象这里也要留意,是很多大白容易踩坑的地方,要注意转换成元组使用;最后就是元组与列表的区别要熟记。