第七章 不可变序列-元组

学习要点

  1. 学习Python的不可变序列的基本特征。
  2. 学习以元组为代表的不可变序列的基本操作。

对标内容

理解元组类型的概念

理解元组和列表的不同

掌握它的基础用法及操作:元组的声明与赋值、元组的访问与更新、元组的遍历、添加、删除、排序等。

情景导入

我们都知道有些信息一旦确立,就不允许随便修改,比如身份证号码、姓名、 出生日期、性别、学校地址、学号等。我们如果用一个表格来存储这些信息,为 了防止随意修改,可以将这个表格设定为只读的。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所示。

image-20220427170958548

​ 图7-1元组的正方向索引和反方向索引

要访问元组中的元素,和访问列表中的元素一样,只需要使用元组变量名加上下标即可。

通用操作一元组的嵌套

元组也是可以嵌套的,并且嵌套的数据类型也不仅仅局限于元组,列表等可变序列以及字典等其他数据也可以嵌套到元组中,如下例所示。

>>> t =(1,2,3, [1,2,3],{2:"xiangjin"})
>>> t
(1, 2, 3, [1, 2, 3], {2: 'xiangjin'})

元组中嵌套的元素是被当作一个整体看待的,访问被嵌套的元素中的某一个值需要通过逐级索引访问。

通用操作一元组的截取

元组的截取和列表的截取相同,需要确定开始位置、结束位置以及步长,步长默认是1。元组的截取同样也包含开始索引的值,但不包含结束索引的值,也就是我们经常讲的“包头不包尾”。

其他通用操作

元组的以下运算和列表的运算相同。

  1. len(): 获取元组的长度。

  2. in:检查元素是否包含在元组中。

  3. max():求最大元素。

  4. min():求最小元素。

  5. sum():求和运算。

  6. +:元组的加法运算。元组虽然是不可变序列,但是依然可以进行加法运算。元组的加法是将两个元组结合在一起,形成一个新的元组,并不改变原元组的值,如下例所示。

    >>>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')
    
  7. *:元组的乘法运算。元组也可以进行乘法运算,和列表的乘法运算一 样,也是将元组的元素重复相应的次数,如下例所示。

    >>> 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]

注意:返回的是列表,不是元组

易错题

  1. 如果元组中只有一个元素,仍然需要加逗号,否则该对象并非元组, 如下例所示。

    >>>a = (1)
    >>>b = (1,)
    >>>print(type(a))
    <class 'int'>    #a为整数
    >>>print(type(b))
    <class 'tuple'>    #b为元组
    
  2. 元组为不可变序列,所以列表的很多操作是无法在元组中使用的,比如更新元素、删除元素、添加元素、反向排序等。

  3. 元组使用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>

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、正确

Copyright © all right reserved,powered by Gitbook该文件修订时间: 2023-07-23 15:21:27