第七章 不可变序列-元组
学习要点
- 学习Python的不可变序列的基本特征。
- 学习以元组为代表的不可变序列的基本操作。
对标内容
理解元组类型的概念
理解元组和列表的不同
掌握它的基础用法及操作:元组的声明与赋值、元组的访问与更新、元组的遍历、添加、删除、排序等。
情景导入
我们都知道有些信息一旦确立,就不允许随便修改,比如身份证号码、姓名、 出生日期、性别、学校地址、学号等。我们如果用一个表格来存储这些信息,为 了防止随意修改,可以将这个表格设定为只读的。Python中也有这样的“只读列表”,它就是“元组”。
元组
什么是元组,它与列表有什么不同?
元组也是序列的一种,Python的元组与列表类似,不同之处有两点:
- 一是元组的元素不能修改;
- 二是元组使用小括号,列表使用中括号。
如何创建元组?
方法1:在括号中添加元素,并使用逗号隔开即可。
>>> t=(1,2,3) >>> t (1, 2, 3)
可以省略括号,如下:
>>> t2=1,2,3 >>> t2 (1, 2, 3)
创建空元组,如下:
>>> t=() >>> t () >>> type(t) <class 'tuple'> >>> t=tuple() >>> t () >>> type(t) <class 'tuple'>
如果只有一个元素,最后必须加一个逗号,如下:
>>> t=(1) >>> t 1 >>> type(t) <class 'int'> >>> t=(1,) >>> t (1,) >>> type(t) <class 'tuple'>
方法2:使用tuple()函数将其他数据类型(必须为可迭代对象)转换为元组,如下例所示。
>>>t = [1,2,3]
>>>print(tuple(t))
(1,2,3)
>>> tuple('abc')
('a', 'b', 'c')
不可变序列的通用操作
元组是不可变序列,所以关于序列的通用操作均可执行,主要考核如下函数及命令。
通用操作—元组的访问
元组的访问也是借助于索引,其索引的表示方法和列表相同,分为正方向索引和反方向索引,如图7-1所示。
图7-1元组的正方向索引和反方向索引
要访问元组中的元素,和访问列表中的元素一样,只需要使用元组变量名加上下标即可。
通用操作一元组的嵌套
元组也是可以嵌套的,并且嵌套的数据类型也不仅仅局限于元组,列表等可变序列以及字典等其他数据也可以嵌套到元组中,如下例所示。
>>> t =(1,2,3, [1,2,3],{2:"xiangjin"})
>>> t
(1, 2, 3, [1, 2, 3], {2: 'xiangjin'})
元组中嵌套的元素是被当作一个整体看待的,访问被嵌套的元素中的某一个值需要通过逐级索引访问。
通用操作一元组的截取
元组的截取和列表的截取相同,需要确定开始位置、结束位置以及步长,步长默认是1。元组的截取同样也包含开始索引的值,但不包含结束索引的值,也就是我们经常讲的“包头不包尾”。
其他通用操作
元组的以下运算和列表的运算相同。
len(): 获取元组的长度。
in:检查元素是否包含在元组中。
max():求最大元素。
min():求最小元素。
sum():求和运算。
+:元组的加法运算。元组虽然是不可变序列,但是依然可以进行加法运算。元组的加法是将两个元组结合在一起,形成一个新的元组,并不改变原元组的值,如下例所示。
>>>T = (21,2,3,4,5,8,0) >>>t = ('a','b','c') >>>print (T+t) (21,2,3,4,5,8,0,'a','b','c')
*:元组的乘法运算。元组也可以进行乘法运算,和列表的乘法运算一 样,也是将元组的元素重复相应的次数,如下例所示。
>>> T=('a','b','c','d') >>> print(T*2) ('a', 'b', 'c', 'd', 'a', 'b', 'c', 'd')
不可变序列——元组的操作
index()
在元组中,index()和在列表中一样,查找元素在元组中的位置,返回值是该元素第一次出现的下标。
语法格式也和在列表中一样:元组名.index(需要查找的元素值),如下例所示。
>>> T = ('a', 'b', 'c', 'd', 'b', 'e', 'b')
>>> print (T.index('b'))
1
注意:如果找不到,则报错ValueError
count()
该函数的作用是查找元素在元组中的个数,返回值为整数。
>>> T = ('a', 'b', 'c', 'd', 'b', 'e', 'b')
>>> print (T.count ('b'))
3
sorted()
由于元组是不可变序列,所以无法使用sort()进行排序,但是可以使用 sorted()进行排序。前面我们已经介绍过,sorted()是Python的内置函数,可用于所有可迭代对象,返回的是一个新的列表,所以sorted()可以用于元组排序, 其使用方法和要求同列表中的sorted()。
>>> a=(1,5,3,6,1)
>>> sorted(a)
[1, 1, 3, 5, 6]
注意:返回的是列表,不是元组
易错题
如果元组中只有一个元素,仍然需要加逗号,否则该对象并非元组, 如下例所示。
>>>a = (1) >>>b = (1,) >>>print(type(a)) <class 'int'> #a为整数 >>>print(type(b)) <class 'tuple'> #b为元组
元组为不可变序列,所以列表的很多操作是无法在元组中使用的,比如更新元素、删除元素、添加元素、反向排序等。
元组使用sorted()进行排序后,会生成一个列表,而不是元组,如下例所示。
>>>a = (2,1,5,34,8,99, 6,7,31) >>>b = sorted(a) >>>print(a) (2,1,5,34,8,99,6,7,31) >>>print(b) [1, 2, 5, 6, 7, 8, 31, 34, 99]
模拟考题
考题1 单选题
关于Python的元组类型,以下选项中描述错误的是( )。
A. 元组不可以被修改 B. Python中元组使用小括号和逗号表示 C. 元组中的元素要求是相同类型 D. 一个元组可以作为另一个元组的元素,可以采用多级索引获取信息
答案:C
解析:A、B、D均为正确的,元组中的元素可以是不同类型,所以C是错误的, 选择C。
考题2 单选题
设有元组tup=(1,2,3,'1','2','3‘),执行语句print(tup[0::2]),得到的结果是 ()。
A. (1,2) B. (1,3) C. (1,3,’2’) D. (1,’1‘,3)
答案:C
解析:根据print(tup[0::2])可知,是截取元组tup的开始到结尾,步长为2的所有元素组成一个新的元组。根据tup=(1,2,3,’1‘,'2','3‘)可知,步长为2取的值分别为1、3、’2’,所以正确答案为C。
考题3 单选题
已知t=(1,2,3,4,5,6),下面哪条元组操作是非法的?()
A. len(t) B. max(t) C. min(t) D. t[1]=8
答案:D
解析:A选项是求t的长度,B选项是求t的最大值,C选项是求t的最小值,D选项是将下标为1的值更新为8;而在元组中,求元素的多少(又称求长度), 求最大值、最小值都是可以的,但是由于元组是不可变序列,元组中的值是不能改变的,所以D的操作是不允许的。
考题4 判断题
d=(), d是一个空元组。( )
答案:正确
解析:根据元组的格式要求,元组必须由小括号加逗号组成,d=()看似只有小括号,没有逗号,但是元组中如果没有任何元素,直接加入逗号,程序会报错; 同时通过print(type(d))我们也可以看到返回是"
",这说明其数据类型确实为元组。
考题5 单选题
以下程序的输出结果是()。
a = tuple('abcdefg')
print(a)
A.('a', 'b', 'c', 'd', 'e', 'f', 'g') B.['a', 'b', 'c','d', 'e', 'f','g'] C. ['abcdefg'] D. 'abcdefg'
答案:A
考题6 判断题
元组的访问速度比列表要快一些,如果定义了一系列常量值,并且主要用途仅仅是对其进行遍历而不需要进行任何修改,建议使用元组而不使用列表。
答案:正确
解析:什么时候使用列表,什么时候使用元组?列表一般用于不确定个数的数据的集合,比如在我们的计算机里面有多少个Word文件,我们事先并不知道,所以用列表来表示;而元组一般用于描述一个东西的特性,个数是提前就知道的, 并且一旦确立是不进行更改的,比如考试需要填写的信息一一学生的姓名、学号、 考号等。
元组单元测试题
模拟考题
一、单选题(共20题,每题4分,共80分)
1、关于Python元组类型,以下选项中描述错误的是?( )
A. 元组不可以被修改
B. Python中元组使用圆括号和逗号表示
C. 元组中的元素要求是相同类型
D. 一个元组可以作为另一个元组的元素,可以采用多级索引获取信息
2、下列创建元组的方法中不正确的是?( )
A. t=(1,2,'信息')
B. t=(1)
C. t=('信息',)
D. t='音乐','体育','美术'
3、已知t=(1,2,3,4,5,6),下面哪条元组操作是非法的?( )
A. len(t)
B. max(t)
C. min(t)
D. t[1]=8
4、有如下Python程序段:
tup1=(1,2,3,4,5)
x=tup1[1]+tup1[-1]
print("x=",x)
执行上述程序段后,输出的结果为?( )
A. 3
B. x= 3
C. 7
D. x= 7
5、以下程序的输出结果是( )。
a = tuple('abcdefg')
print(a)
A. ('a', 'b', 'c', 'd', 'e', 'f', 'g')
B. ['a', 'b', 'c', 'd', 'e', 'f', 'g']
C. ['abcdefg']
D. 'abcdefg'
6、下列程序的执行结果是?( )
s=(1,2,3,4,5,6,7,8)
print(len(s),max(s),min(s))
A. 7 8 1
B. 8 8 1
C. 8 1 8
D. 7 1 8
7、下列语句,不能创建元组的是?( )
A. tup=()
B. tup=(1)
C. tup=1,2
D. tup=(1,2)
8、对于元组里面的元素,可以执行的操作有?( )
A. 读取
B. 添加
C. 修改
D. 删除
9、正确定义元组yuan的语句是?( )
A. yuan={1,2,3}
B. yuan=[1,2,3]
C. yuan=(1,2,3)
D. yuan=<1,2,3>1,2,3>
10、对于元组tup=(1,2,3,4,5)执行的操作非法的是?( )
A. len(tup)
B. max(tup)
C. min(tup)
D. tup[1] = 6
11、若s=(1,'a',[1,2]),则len(s)的值为?( )
A. 错误
B. 2
C. 3
D. 4
12、小明用元组a存储自己喜欢吃的水果,a=("apple","banana","orange","banana","pear"),则a.index("banana")的值是?( )
A. 0
B. 1
C. 2
D. 3
13、元组同列表那样可以有多个元素,但只能执行如下的哪个操作?
A. 修改
B. 添加
C. 读取
D. 删除
14、以下关于元组的描述正确的是?( )
A. 元组和列表相似,所有能对列表进行的操作都可以对元组进行
B. 创建元组时,若元组中仅包含一个元素,在这个元素后可以不添加逗号
C. 元组中的元素不能被修改
D. 多个元组不能进行连接
15、对于元组tup=('富强','民主','文明','和谐','爱国')操作正确的是?
A. tup[2:4:2] = ('敬业')
B. tup[4]='敬业'
C. del tup[4]
D. tup*3
16、下面代码运行的结果是?( )
tup1 = ('中国', '电子学会', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7 )
print (tup1[-1],tup2[1:5])
A. 2000 (2, 3, 4, 5)
B. 2000 (2, 3, 4, 5,6)
C. (2000 (2, 3, 4, 5,6))
D. 1997 (1,2, 3, 4, 5)
17、已知t1=(2,3),t2=(4,5,6),那么t2+t1*2的结果是?
A. (2, 3, 2, 3, 4, 5, 6)
B. (4, 5, 6, 2, 3, 2, 3)
C. (2, 3, 4, 5, 6, 2, 3, 4, 5, 6)
D. (2, 3, 4, 5, 6)
18、表达式tuple(list('Python'))的运算结果是?
A. ['Python']
B. ('P', 'y', 't', 'h','o', 'n')
C. ['P', 'y', 't', 'h','o', 'n']
D. ('Python')
19、小明用元组a存储小组同学的身高,a=(136.0,135.0,142.0,140.0),则min(a)的值是?
A. 136.0
B. 135.0
C. 142.0
D. 140.0
20、已知元组tup2=(1,14,51,4,19,198,10),下列说法有错误的是?
A. print(tup2[1:-1])可以截取元组的一部分,输出的结果为(14,51,4,19,198,10)
B. print(tup2[3:])可以截取元组的一部分,输出的结果为(4,19,198,10)
C. print(tup2[3:6])可以截取元组的一部分,输出的结果为(4,19,198)
D. print(tup2[5])可以访问元组的第六个元素,输出的结果为198
二、判断题(共5题,每题4分,共20分)
21、若运行程序
t1=(45)
print(type(t1))
则输出结果为
正确 错误
22、元组d = (2020, 1, 1), 执行d = (d[0]+1, 1, 1)后,d是(2021, 1, 1)
正确 错误
23、元组的定义方法与列表完全相同。
正确 错误
24、元组一旦创建,其中的元素就不能再被修改了。
正确 错误
25、(127,3.56,'1&5#!^*2','4.(.$0..6')是一个合法的元组
正确 错误
答案
一、单选题
1、C 2、B 3、D 4、D 5、A
6、B
试题解析:元组内置函数的考核,len()统计元组元素个数,应该为8,max()返回元组中元素最大值,8,min()返回最小 值,1,所以选择B
7、B 8、A
9、C
试题解析:定义元组使用括号,也可以不用符号
10、D
11、C
试题解析:理解元组的元素,掌握求元组长度的函数
12、B 13、C 14、C 15、D 16、A
17、B 18、B 19、B 20、A
二、判断题
21、错误 22、正确 23、错误 24、正确 25、正确