Python序列类型之元组

上一篇:学好Python列表的所有用法,这一篇看完就够了(万字长文♥记得收藏哦♥)

文章目录

  • 前言
  • 一、元组的创建和删除
    • 1. 使用赋值运算符直接创建元组
    • 2. 创建空元组
    • 3. 创建数值元组
    • 4. 删除元组
  • 二、访问元组元素
  • 三、遍历元组
  • 四、修改元组元素
  • 五、元组推导式
  • 六、元组与列表的区别
  • 总结


前言

元组(tuple)是 Python 中另一个重要的序列结构,与列表类似,也是由一系列按特定顺序排列的元素组成,但是它是不可变序列。因此,元组也可以称为不可变的列表。在形式上,元组的所有元素都放在一对 “()” 中,两个相邻的元素间使用 “,” 分隔。在内容上,可以将整数、实数、字符串、列表、元组等任何类型的内容放入到元组中,并且在同一个元组中,元素的类型可以不同,因为它们之间没有任何关系。通常情况下,元组用于保存程序中不可修改的内容


一、元组的创建和删除

在 Python 中提供了多种创建元组的方法,下面分别进行介绍。

1. 使用赋值运算符直接创建元组

同其他类型的 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'>

2. 创建空元组

在 Python 中,也可以创建空元组,例如,创建一个名称为 empty 的空元组,可以使用下面代码:

empty = ()

空元组可以应用在为函数传递一个空值或者返回空值时。例如,定义一个函数必须传递一个元组类型的值,但还不想为它传递一组数据,那么就可以创建一个空元组传递给它。

3. 创建数值元组

在 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 对象创建元组,还可以通过其他对象创建元组。

4. 删除元组

对于已经创建的元组,不再使用时,可以使用 del 语句将其删除。语法格式如下:

del tuplename

其中,tuplename 为要删除的元组名称。

说明:del 语句在实际开发时,并不常用。因为 Python 自带的垃圾回收机制会自动销毁不用的元组,所以即使我们不手动将其删除,Python 也会自动将其回收。

例如,定义一个名称为 scenic_spots 的元组,然后应用 del 语句将其删除。可以使用下面代码:

scenic_spots = ('玉龙雪山', '丽江古城', '西双版纳热带植物园')
del scenic_spots
print(scenic_spots)

代码运行之后会报错,因为已经删除了 scenic_spots 元组,再打印的话会显示未定义该名称,如下图所示:

Python序列类型之元组_第1张图片

二、访问元组元素

在 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 循环进行遍历。比如下图代码所示:

Python序列类型之元组_第2张图片
另外,元组还可以使用 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 支持的类型都可以。那么它们之间有什么区别呢?

列表类似于我们用铅笔在纸上写下自己喜欢的格言,写错了还可以擦掉;而元组则类似于用钢笔写下的格言,写错了就擦不掉了,除非换一张纸重写。

列表和元组的区别主要体现在以下几个方面:

  • 列表属于可变序列,它的元素可以随时修改或者删除;元组属于不可变序列,其中的元素不可以修改,除非整体替换。
  • 列表可以使用 append()、extend()、remove()等方法实现添加和删除元素,而元组没有这些方法,所以不能向元组中添加和修改元素。同样,元组也不能删除元素。
  • 元组比列表的访问和处理速度快,所以当只是需要对其中的元素进行访问,而不进行任何修改时,建议使用元组。
  • 列表不能作为字典的键,而元组则可以。

总结

以上就是跟大家分享的元组所有知识,元组当中创建访问以及遍历非常重要,是开发的基本功;元组推导式中的生成器对象这里也要留意,是很多大白容易踩坑的地方,要注意转换成元组使用;最后就是元组与列表的区别要熟记。

你可能感兴趣的:(Python入门基础语法,python,元组,元组推导式,元组和列表区别,序列类型)