山地人

Python 元组(Tuple)

山地人
山地人
2021-07-16

什么是元组(Tuple)

元组是Python中一种重要的数据类型,适合用来存放一组有序的异构数据(不同类型的数据),并且一旦创建就不可修改。

创建元组

使用一对()小圆括号,将数据项依次放入括号中,用逗号隔开。

course = (2021,"Python",98)

创建元组时,对于元组内只要一个元素的情况,特别需要注意,放置Python解释器将括号解释成了运算优先级的()。 因此,对于只有一个元素的元组,要在元素后方留下一个逗号:(2020,)

info = (2020,)

启动终端,试试创建用元组类型创建一个变量。

访问元组中的成员

一旦创建好元组对象,接下来就来看看如何访问元组中的元素。可以通过[]来访问元组内成员。

访问单个元素

通过[index]单个下标索引的方式,可以访问任意一个元组中的元素,元组中第一个元素的下标为0,所以[0]可以获取元组第一个元素,[1]获取第二个元素,依次类推。

course = (2021,"Python",98)
year = course[0]
courseName = course[1]
score = course[2]

另外索引下标也可以是负值,比如[-1]表示元组中的最后一个元素,[-2]表示访问元组中倒数第二个元素

score = course[-1]
courseName = course[-2]
year = course[-3]

访问多个元素

在Python中,还可以通过切片的方式访问元组中的一片连续的元素,[start:end]通过在索引中指定要访问的起始索引和结束索引位置前一个元素(注意不包含end位置的元素)。当然startend也可以省略。

[start:end]这种索引中的startend是可以省略的

  • start省略后,默认会是0[:end]等同于[0:end],意思是从第一个元素一直到end位置前一个元素。
  • end省略后,默认会是-1[start:]等同于[start:-1],意思是从start索引位置的元素一直到最后一个元素。
  • [:]对于这种:前后都省略的情况,也就意味着访问整个列表上的所有元素。
# 下面三行结果都是: ('Python', 98)
course[1:3]
course[1:]
course[1:-1]
# 结果是:(2021, 'Python')
course[:2]

启动终端,试试不同的索引方式。

尝试修改元组成员

前面说过,元组一旦创建,其内部的值就不可更改。耳听为虚眼见为实,下面我们动手试一试

# 看看运行这行是否会报错
course[0] = 2022

启动终端,输入上面语句,你看到了什么?

没错,我们得到了这样的报错信息,告诉我们tuple的成员不支持赋值。

TypeError: 'tuple' object does not support item assignment

尝试删除元组成员

既然不能改,那是否能删除元组内部的成员,继续实验:

del course[0]

启动终端,输入上面语句,你看到了什么?

这一次,我们依然得到了解释器的报错,提醒我们tuple不支持元素的删除操作。

TypeError: 'tuple' object doesn't support item deletion

元组内部的元素是不能删除,但是元组是可以通过del course进行删除的。

del course

启动终端,看看是否能删除course,删除后再次使用course访问,看看这个变量是否还存在?

删除后,当我们再次使用course访问时,我们得到了:

NameError: name 'course' is not defined

此时course变量未定义,说明这个course确实被删除了。

元组解包

除了通过索引方式访问元组,还可以通过解包(unpack)的方式来获取元组中的元素,那上面的course元组具体:

(year, name, score) = course

通过上面的方式,我们可以把course中的元素一一”提取”,并赋值给左侧的对应变量中。需要注意的是,左侧的结构中的变量数量要和右侧元组中成员的数量对应,如果左侧的变量数量过多或过少,都会导致解包失败。

启动终端,测试解包,然后试试删除左侧的一些变量,观察运行结果。

经过上面的实验,你会发现当左侧变量值少于或者多于右侧元素中的值时,会得到如下报错

# 左侧变量少了:
ValueError: too many values to unpack
# 左侧变量多了:
ValueError: need more than 3 values to unpack

元组的运算

元组支持两个运算符:+*+用于连接,生成一个新的元组。*用于通过将原始的元组中的元素重复多次创建一个新的元组。

a = (1,2,3)
b = a + (4,5)
# 结果为: (1, 2, 3, 4, 5)
c = a * 3
# 结果为: (1, 2, 3, 1, 2, 3, 1, 2, 3)

启动终端,测试+*号运算符。

元组的方法

元组仅提供了两个方法,分别是countindex

方法名说明例子
tupleObj.count(el)统计元组中包含的el对象的数量course.count('2020')
tupleObj.index(el)查找元组中el首次出现的索引位置course.index('Python')
a = (1,2,3,2,5,8,4,2)
a.count(2)
a.index(2)

启动终端,测试这两个方法。

元组和列表的区别

差异元组列表
用途存放一组不同类型的数据存储一组相同类型的数据
可变性一旦创建不可更改后续可以修改内部元素
语法(2021,"Python",98)[95,88,97,86,77]

至此,本篇教程也到了该和你说再见的时候了,我们下期再见。

学完本篇互动教程,如果你觉得体验不错,可以把网页链接发送给你的小伙伴,让他/她也来感受一下。当然,你也可以继续看看网站上其他的的互动教程,希望`idev365`能够给你带来收获。

学习教程的过程中碰到了问题,或者对idev365有什么改进意见和想法,欢迎加入idev365微信内测群,和山地人交流你的想法。