07. 元组

一、什么是元组

  元组(tuple)是 Python 中的一种序列结构,和列表类似,也是由一系列按特定顺序排列的元素组成,但它是不可变序列。因此,元组也可以称为不可变的列表。在形式上,元素的所有元素都放在一对“()”中,两个相邻元素间使用“,”分隔。在内容上,可以将整数、实数、字符串、列表、元组等任何类型的内容放在元组中,并且在同一个元素中,元素的类型可以不同。

从元素和列表的定义上看,这两种结构比较相似,两者之间的主要区别为:元组是不可变序列,列表是可变序列。即元组的元素不可以单独修改,而列表可以任意修改。

二、元组的创建、删除和访问

2.1、元组的创建

【1】、使用 () 创建列表

  我们可以通过 () 来创建元组,同其它类型的 Python 变量一样,创建列表时,也可以使用赋值运算符“=”直接将一个元组赋值给变量,语法格式如下:

tuplename = (element1, element2, ...)

  我们可以通过 () 来创建一个空元组:

names = ()
print(names)
print(type(names))

  在 Python 中,元组使用一对小括号将所有的内容括起来,但是小括号并不是必须的,只要将一组值用逗号分隔来,Python 就可以视其为元组。

names = ("Sakura", "Mikoto", "Shana")
print(names)
print(type(names))

names = "Kikyō", "Kagome", "Moroha"
print(names)
print(type(names))

  如果要创建一个的元组只包含一个元素,则需要在定义元素时,在元素后面加一个逗号“,”。

names = "Sakura",
print(names)
print(type(names))

names = ("Mikoto",)
print(names)
print(type(names))

创建元组的语法与创建列表的语法类似,只是创建列表时使用的是“[]”,而创建元组时使用的是“()”

【2】、使用 tuple() 方法创建元组

  在 Python 中,可以使用 tuple() 函数直接将可迭代对象转换为元组。

tuplename = tuple(data)

  其中,data 标识可以转换为列表的数据,其类型可以是 range 对象字符串元组 或者 其它 可迭代 类型的数据。

num = tuple(range(1, 11))
print(num)
print(type(num))

2.2、元组的删除

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

del tuplename

  在删除元组前,一定要保证的输入的元组对象是已经存在的,否则会出现以下错误:

NameError: name 'names' is not defined

2.3、访问元组元素

  元组中的对象都会按照插入的顺序存储到元组中,第一个插入的对象保存到第一个位置,第二个保存在第二个位置。我们也可以通过 索引 的方式获取指定的元素。索引 是元素在元组中的位置,元组中的每一个元素都有一个索引。索引是 0 开始的整数,元组第一个位置索引为 0,第二个位置索引为 1,依次类推。它的语法格式如下:

tuplename[index]
names = ("Sakura", "Mikoto", "Shana")
print(names[0])
print(names[1])
print(names[2])

  如果使用的索引超过最大的索引会报以下错误:

IndexError: tuple index out of range

  在 Python 中索引可以是 负数。这个索引从右向左计数,也就是从最后的一个元素开始计数,即最后一个元素的索引是 -1,倒数第二个第二个元素的索引值为 -2,以此类推。

names = ("Sakura", "Mikoto", "Shana")
print(names[-1])
print(names[-2])
print(names[-3])

在采用负数做索引时,是从 -1 开始的,而不是从 0 开始的,即最后一个元素的下标为 -1,这是为了防止与第一个元素重合。

2.4、遍历元组

  遍历元组,指的就是将元组中的所有元素取出来,我们可以使用 for 循环直接遍历元组。for 循环的代码块会执行多次,序列中有几个元素就会执行几次,每执行依次就会将序列中的一个元素赋值给变量。

for item in tuplename:
    # 遍历元组操作
names = ("Sakura", "Mikoto", "Shana", "Kikyō", "Kagome", "Moroha")
for name in names:
    print(name)

  我们还可以使用 while 循环来遍历元组。

names = ("Sakura", "Mikoto", "Shana", "Kikyō", "Kagome", "Moroha")
i = 0
while i < len(names):
    print(names[i])
    i += 1

三、元组元素的查找

  在 Python 中,我们还可以使用 in 关键字检查某个元素是否为元组的成员,即检查某个元素是否包含在某个元组中。如果存在,返回 True,否则返回 False。

element in tuplename
names = ("Sakura", "Mikoto", "Shana", "Kikyō", "Kagome", "Moroha")
result = "Sakura" in names
print(result)

  另外,在 Python 中,我们还可以使用 not in 关键字实现检查某个元素是否不包含在指定的元组中。如果不在,返回 True,否则返回 False。

element not in tuplename
names = ("Sakura", "Mikoto", "Shana", "Kikyō", "Kagome", "Moroha")
result = "Sakura" not in names
print(result)

四、元组切片

  切片是从现有的元组中,获取一个新的元组,不会影响原有的元组。实现切片的语法格式如下:

tuplename[start : end : step]

  通过切片获取元素时,会包括起始位置的元素,不会包括结束位置的元素。如果不指定起始位置,默认从 0 开始,如果不指定截至位置,默认为元组的长度。

  在进行切片操作时,如果指定了步长,那么将会按照步长遍历元组的元素,否则,将一个一个遍历元组。如果省略步长,默认为 1,最后的一个冒号也可以省略。

names = ("Sakura", "Mikoto", "Shana", "Kikyō", "Kagome", "Moroha")
name = names[1:5:2]
print(names)
print(name)

# 如果省略步长,则默认步长为1
name = names[1:5]
print(name)

# 如果省略截至位置,会一直截取到最后
name = names[1:]
print(name)

# 如果省略开始位置,则会从第一个元素开始截取
name = names[:5]
print(name)

  如果想复制整个元组,可以将 起始位置截至位置 都省略,但是中间的冒号要保留。

names = ("Sakura", "Mikoto", "Shana", "Kikyō", "Kagome", "Moroha")
# 如果省略开始位置和截至位置,会复制一个元组
name = names[:]
print(names)
print(name)

  步长不能为 0, 但是可以为负数,如果是负数,将从元组的后部向前取元素。

names = ("Sakura", "Mikoto", "Shana", "Kikyō", "Kagome", "Moroha")
# 步长如果是负数,则会从元组的后部向前面取元素
name = names[::-1]
print(names)
print(name)

五、元组的常用操作

【1】、元组相加

  在 Python 中,支持元组进行相加操作,即将两个元组进行拼接,不会去除重复的元素,使用加(+)运算符实现。语法格式如下:

names1 = ("Sakura", "Mikoto", "Shana", "Kikyō", "Kagome", "Moroha")
names2 = ("Akame", "Kurome", "Sakura")
names = names1 + names2
print(names)

【2】、元组乘法

  在 Python 中,使用数字 n 乘以一个元组会生成一个新的元组。新元组的内容为原来元组被重复 n 次的结果。

names1 = ("Sakura", "Mikoto", "Shana", "Kikyō", "Kagome", "Moroha")
names2 = names1 * 3
print(names2)

【3】、计算元组的长度、最大值 和 最小值

  在 Python 中,提供了内置函数计算元组的长度、最大值和最小值分别是:

len(tuplename)                                                                  # 获取元组的长度
min(iterable, *, key = None)                                                    # 返回元组中的最小元素
max(iterable, *, key = None)                                                    # 返回元组中的最大元素
num = (12, 43, 121, 34, 64, 322, 46)
print("元组的长度为:", len(num))
print("元组中的最小元素为:", min(num))
print("元组中的最大元素为:", max(num))

【4】、获取指定元素出现的个数

  使用元组对象的 count() 方法可以获取指定元素在元组中出现的个数。这里只能进行精确的匹配,即不能是元素值的一部分。count() 方法的返回值就是元素在元组中出现的次数。它的语法格式如下:

tuplename.count(x)
names = ("Sakura", "Mikoto", "Shana", "Kikyō", "Kagome", "Moroha", "Mikoto", "Sakura")
print(names.count("Sakura"))

【5】、获取指定元素首次出现的下标

  使用元组对象的 index() 方法可以获取指定元素在元组中出现的位置(即索引)。基本语法格式如下:

tuplename.index(x[, start[, stop]])
names = ("Sakura", "Mikoto", "Shana", "Kikyō", "Sakura", "Kagome", "Moroha", "Mikoto", "Sakura")

# 获取指定元素在元组中第一次出现的索引
print(names.index("Sakura"))

# index()的第二个参数表示查找的起始位置
print(names.index("Sakura", 5))

# index()的第三个参数表示查找的结束位置
print(names.index("Sakura", 3, 5))

  如果获取元组中没有的元素或抛出如下异常:

ValueError: tuple.index(x): x not in tuple

六、元组解包

  解包(解构)就是将元组当中每一个元素都赋值给一个变量。

names = ("Sakura", "Mikoto", "Shana")
name1, name2, name3 = names
print(name1)
print(name2)
print(name3)

  我们还可以利用元组解包的特性,来实现两个变量的交换。

a = 10
b = 20
print("a = ", a)
print("b = ", b)

# 利用元组的解包,交换两个变量的值
a, b = b, a
print("a = ", a)
print("b = ", b)

  在对一个元组进行解包时,变量的数量必须和元组中的元素数量一致,也可以在变量的前面添加一个 * 号,这样变量将会获取元组中剩余的元素。

names = ("Sakura", "Mikoto", "Shana", "Kikyō", "Kagome", "Moroha")

name1, name2, *name3 = names
print(name1)
print(name2)
print(name3)
print(type(name3))

不能同时出现两个或以上的 * 变量;

七、生成器表达式

  使用生成器表达式可以快速生成一个元组,它的表现形式和列表推导式类似,只是将列表推导式中的方括号 “[]” 修改为圆括号 “()”。

tuplename = (表达式 for 变量 in 可迭代对象 if 条件)
num = (value**2 for value in range(1,11))
print(num)
print(type(num))

  从上面的执行结果可以看出,使用生成器表达式生成的结果并不是一个元组或列表,而是一个生成器对象。这一点和列表推导式是不同的,这时需要我们可以把该生成器对象转换为元组或列表。其中,转换为元组需要使用 tuple() 函数,而转换为列表需要使用 list() 函数。

num = (value**2 for value in range(1,11))
num_list = list(num)
print(num_list)
print(type(num_list))
num = (value for value in range(1,11) if value % 2 == 0)
num_tuple = tuple(num)
print(num_tuple)
print(type(num_tuple))

八、列表与元组的区别

列表 元组
列表属于可变序列,它的元素可以随时修改或删除 元组属于不可变序列,其中的元素对应的内存地址不可以改变
列表可以使用 append()、extend()、insert()、remote()、pop() 等方法修改列表元素 元组没有这些方法
列表可以通过使用切片访问和修改列表中的元素 元组只支持通过切片访问元素,不支持修改
列表的访问和处理速度较慢 元组的访问和处理速度较快
列表不能作为字典的键 元组可以作为字典的键
persons = (["Sakura", 10], ["Mikoto", 14])
print(persons)
print("id(persons[0]): ", id(persons[0]))
print("id(persons[1]): ", id(persons[1]))
print()

persons[0][1] = 12
print(persons)
print("id(persons[0]): ", id(persons[0]))
print("id(persons[1]): ", id(persons[1]))
posted @ 2024-09-18 20:55  星光映梦  阅读(89)  评论(0)    收藏  举报