
点击上方蓝字·关注我们

本次为大家带来的是2023年9月份Python四级认证真题解析。
2023年GESP9月认证Python四级试卷解析
一、单选题(每题2分,共30分)
题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
答案 | B | A | C | C | A | B | B | A | B | A | B | C | C | B | D |
1.人们所使用的手机上安装的App通常指的是( )。
A.一款操作系统
B.一款应用软件
C.一种通话设备
D.以上都不对
【答案】B
【解析】本题属于考察计算机基础知识。App是Application的缩写,通常指的是应用程序。在计算机领域,App是指一种可以在特定操作系统上运行的软件程序,它为用户提供了特定的功能和服务。例如,手机上的微信、支付宝等应用就是App。故正确答案为B选项。
2.下列流程图的输出结果是( ) ?

A. 9
B. 7
C. 5
D. 11
【答案】A
【解析】本题属于考察流程图的知识。该流程图主要进行条件判断,当m*n>20时,执行m=m-2,n=n+1。否则,执行m=2*m+1,n=n+1。再判断n>5,满足条件输出m,不满足条件时,回到第一个判断条件。该流程图判断5次,最后m=9。故正确答案为A选项。
3.下面有关print()函数的说法,错误的是( )。
A. print()函数的sep和end参数为带有默认值的命名关键字参数。
B. print()函数可以输出多个表达式的值,其参数为变长参数。
C. 如果print()函数同时使用sep和end参数,则要求sep在前end在后。
D. print()函数可以输出多个不同数据类型表达式的值。
【答案】C
【解析】本题属于考察Python内置函数print()函数参数的知识。在Python的print( )函数中,sep和end参数用于控制输出的分隔符和结束符。sep参数用于指定分隔符,默认为一个空格;end参数用于指定结束符,默认为换行符。如果同时使用sep和end参数,那么它们的顺序并不影响输出的结果,即sep在前或end在前都可以实现预期的效果。故正确答案为C选项。
4.下面Python代码执行后输出是( )。

A. [1]
B. [1, 2, 4]
C. [1, 2, 4, 4]
D. 触发异常
【答案】C
【解析】本题属于考察Python内置函数remove()函数调用的知识。按照执行顺序,符合判断条件的元素被删除之后,后面的元素会前移,再次调用时会判断列表的下一个元素。本题中,要求移除能整除2的数据,第一次执行完remove()列表为[1,2,2,4,4,4],第二次执行完列表为[1,2,4,4,4],第三次执行完为[1,2,4,4]。故正确答案为C选项。
5.下面代码执行后输出是( )。

A. 1, 2, 3
B. 1, 2, 22
C. 11, 11, 22
D. 11, 11, 3
【答案】A
【解析】本题属于考察Python函数参数、作用域的知识。在Python中,函数是一段具有特定功能的可重用代码。当我们调用一个函数时,需要传递一些值给函数,这些值被称为参数。函数的参数可以分为形参和实参两种。此题输出语句位于函数体外,输出的是全局变量的a,b,c。输出的是1,2,3,故正确答案为B选项。
6.下面代码执行后输出是( )。

A. [1, 2, 3]
B. [1, 2, 3, 4]
C. [4]
D. None
【答案】B
【解析】本题属于考察Python函数参数、作用域的知识。无论函数传递的参数的可变还是不可变,只要针对参数使用赋值语句,会在函数内部修改局部变量的引用,不会影响到外部变量的引用,但是传递的参数是可变类型(列表(List)、字典(Dictionary)和集合(Set)),在函数内部使用方法修改了数据的内容,同样会影响到外部的数据。本题中,当函数接收到列表参数时,它实际上是接收到了对该列表对象的引用。因此,在函数内部对列表进行的任何修改都会影响到外部的列表对象。故正确答案为B选项。
7.下面Python代码执行后输出是( )。

A. (1, 2, 3),(1, 2, 3)
B. (1, 2, 3, 4),(1, 2, 3)
C. (1, 2, 3),(1, 2, 3, 4)
D. (1, 2, 3, 4),(1, 2, 3, 4)
【答案】B
【解析】本题属于考察Python作用域和元组基本知识。元组(tuple)是Python中的一种不可变序列类型,它由多个元素组成,元素之间用逗号分隔。在函数内修改其数据将形成新的数据,不影响函数外。故正确答案为B选项。
8.下面Python代码执行后输出是( )。

A. [2, 3, 7, 11, 15]
B. [15, 11, 7, 3, 2]
C. [11, 2, 3, 7, 15]
D. None
【答案】A
【解析】本题属于考察冒泡排序算法的知识。冒泡排序是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序不符合要求就把他们交换过来。重复进行直到没有再需要交换,也就是说该数据已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。故正确答案为B选项。
9.上题bubbleSort()函数的时间复杂度是( )。
A. O(n)
B. O(
)
C. O(
)
D. O(1)
【答案】B
【解析】本题属于考察冒泡算法复杂度的估算知识。如果数据是正序,有n个数,只需要走一趟即可完成排序。所需的比较次数C和记录移动次数M均达到最小值,即:Cmin=n-1;Mmin=0;所以,冒泡排序最好的时间复杂度为O(n)。如果数据是反序的,则需要进行n-1趟排序。每趟排序要进行n-i次比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值O(n2)。故正确答案为B选项。
10.下面Python代码中的dictA存储为字典,key(键)为i和j的组合,value(值)为i*j,形如{(1,1):1, (1,2):2},横线处应填上代码是( )。

A. dict99[(i, j)]
B. dict99[[i, j]]
C. dict99(i, j)
D. dict99{i, j}
【答案】A
【解析】本题属于考察Python复合数据类型的嵌套知识。题目要求形如{(1,1):1, (1,2):2},按照字典的赋值格式dict[key] = value,故正确答案为A选项。
11.下面Python代码中的dictA变量存储形如{1: [1], 2: [1, 2], 3: [1, 3], 4: [1, 2, 4], 5: [1, 5], 6: [1, 2, 3, 6]}的数据,即1~99之间每个整数的因数(所有能被整除的正整数),横线处应填入是()。

A. [j for j in range(i) if i % j != 0]
B. [j for j in range(1,i+1) if i % j == 0]
C. [j for j in range(1,i+1) if i % j]
D. [j for j in range(i) if i % j == 0]
【答案】B
【解析】本题属于考察Python复合数据类型的嵌套和列表推导式的知识。每个键对应的值都是能被i整除的正整数,包括i。所以应使用range(1,i+1),同时判断是否能被i整除,即余数是否为0。故正确答案为B选项。
12.要打开一个已经存在的图片文件并读取但不修改数据,则打开模式应该设定为( )。
A. wb
B. w+
C. rb
D. r+
【答案】C
【解析】本题属于考察Python文件读写操作知识。在Python中,open()函数用于打开文件并返回一个文件对象。open()函数的第二个参数是文件模式,它决定了文件的访问方式。要打开一个已经存在的图片文件并读取但不修改数据,则打开模式应该设定为rb,rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。wb是以二进制格式打开一个文件只用于写入,w+打开一个文件用于读写,如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。r+以读写方式打开文件,如果文件不存在则报错。如果文件存在,可以从头开始读取和写入。故正确答案为C选项。
13.下列Python代码执行时如果输入3.14,将输出的是( )。

A. 2#
B. 1#4#
C. 2#4#
D. 2#3#4#
【答案】C
【解析】本题属于考察Python异常处理和内置函数结合使用的知识。map()接收一个函数和一个list,并把函数依次作用在list的每个元素上,得到一个新的list并返回。split()将一个字符串按照指定的分隔符进行分割,返回一个由分割后的子字符串组成的列表。input()函数返回的是字符串类型。异常处理机制try...except...else...finally是一种用于捕获和处理程序运行过程中可能出现的异常。它包含以下几个部分:try:尝试执行一段可能引发异常的代码。如果这段代码没有引发异常,那么except和else部分将被跳过,程序将继续执行后面的代码。except:当try中的代码引发异常时,程序将跳转到except部分执行。你可以在except后面指定要捕获的异常类型,例如,except ZeroDivisionError异常表示捕获除数为零的异常。else:当try中的代码没有引发异常时,程序将执行else部分的代码。注意,一个try语句块中只能有一个else部分。finally:无论try中的代码是否引发异常,程序都会执行finally部分的代码。故正确答案为B选项。
14.以下选项在Python中能输出(1, 4, 9, 16, 25, 36, 49, 64, 81, 100) 的是( )。
A. print(tuple(i**2 for i in range(10)))
B. print(tuple([i*i for i in range(1,10+1)]))
C. print(tuple(i*i for i in range(10+1)))
D. print(tuple(map(lambda x:x**2,range(10))))
【答案】B
【解析】本题属于考察Python复合数据类型的嵌套知识。(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)分别是1-10的二次方,即i*i或i**2。所以range()函数的起始值为1,结束值为10+1。A,C,D选项的range()函数取值范围不对,故正确答案为B选项。
15.Python赋值语句是lstA = [6, 7, 8, 9] ,删除值为8的元素,错误的语句( )。
A. lstA.remove(8)
B. lstA.pop(2)
C. del lstA[2]
D. lstA.del[2]
【答案】D
【解析】本题属于考察Python内置函数的调用和列表知识。在Python中,列表是一种有序的集合,可以随时添加和删除其中的元素。删除列表元素的方法可以使用del关键字删除指定索引的元素,格式为del列表名[索引值];2.使用remove()方法删除列表中的指定值的第一个匹配项;3.使用pop()方法删除并返回指定索引的元素,默认为最后一个元素;4.使用clear()方法清空列表中的所有元素。故正确答案为D选项。
二、判断题(每题2分,共20分)
题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
答案 | √ | × | √ | √ | √ | × | √ | × | √ | √ |
1.我们常说的互联网(Internet)是一个覆盖全球的广域网络,它不属于任何一个国家。
【答案】正确√
【解析】本题考察计算机网络的基本知识。互联网,又称国际网络,指的是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。互联网是全球性的。这就意味着这个网络不管是谁发明了它,是属于全人类的。故说法正确。
2.我国第一台大型通用电子计算机使用的逻辑部件是晶体管。
【答案】错误×
【解析】本题考察计算机网络的基本知识。1958年8月1日,中国科学院计算技术研究所和北京有线电厂(国营738厂)根据苏联提供的M-3小型机技术资料制成的“八一”型通用电子管计算机(又称103机)完成了四条指令的运行,标志着中国人制造的第一架通用数字电子计算机正式诞生。时隔一年多,1959年9月,根据苏联有关计算机技术资料制成的104大型通用电子计算机通过试运算,运算速度提升到每秒1万次。《人民日报》为此发表消息,正式宣告中国第一台大型通用电子计算机试制成功。机体内由半导体锗二极管和电子管组成。故说法错误。
3. Python的内置函数sorted()函数是稳定排序。
【答案】正确√
【解析】本题考察sorted()函数相关知识和算法稳定概念,sorted()函数的实现基于Timsort算法,Timsort算法在排序时,先将待排序的序列分割成若干个子序列,对每个子序列进行排序,然后将已排序的子序列合并成一个新的有序序列,直到整个序列排好序为止。是结合了合并排序和插入排序而得出的排序算法。如果一个排序确保不会改变比较结果相等的元素的相对顺序就称其为稳定的。故说法正确。
4.对包含N个元素列表(list)进行冒泡排序算法,其时间复杂度是
。
【答案】正确√
【解析】本题属于考察冒泡算法复杂度的估算知识。如果数据是正序,有n个数,只需要走一趟即可完成排序。所需的比较次数C和记录移动次数M均达到最小值,即:Cmin=n-1;Mmin=0;所以,冒泡排序最好的时间复杂度为O(n)。如果数据是反序的,则需要进行n-1趟排序。每趟排序要进行n-i次比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值O(n2)。故说法正确。
5. ()+() 在Python中是合法的表达式,其值为()。
【答案】正确√
【解析】本题考察元组和运算符使用的知识。在Python中,通过“+”将两个或多个元组合并成一个新的元组是拼接元组。元组是一种不可变的序列类型,用于存储一组有序的数据。通过拼接元组,我们可以将多个元组合并在一起,形成一个更大的元组。故说法正确。
6.下面代码中的Nums.txt文本文件中含有0-9共计10个数字,分为两行存储,第1行为0-4,第2行为5-9,程序执行后将输出10。

【答案】错误×
【解析】本题考察文件读取的知识,read()用于从文件中读取内容。当使用open()打开一个文件时,会返回一个文件对象,然后可以使用该对象的read()方法来读取文件内容。会将文件中的所有字符读取到一个字符串中,并返回这个字符串。结果应为11,故说法错误。
7. Python文本文件读取函数readlines()能按行读取文本文件,且返回值为list类型。
【答案】正确√
【解析】本题考察文件读取的知识,readlines()是Python中文件对象的方法,用于一次性读取文件中的所有行,并返回一个包含所有行的列表。每一行都是一个字符串。故说法正确。
8.下面的Python代码执行后最后一行将输出没有偶数的lst。

【答案】错误×
【解析】本题属于考察Python复合数据类型的嵌套知识。del是Python中的一个关键字,用于删除对象。它可以删除变量、列表元素、字典元素等。在循环中删除列表元素时,需要使用索引来定位要删除的元素,而不是直接使用变量名。因此,应该使用del l[i]而不是del i。所以最后输出为[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]。故说法错误。
9.在与异常处理相关的关键字中,finally所属内容不管是否发生异常都将会被执行。
【答案】正确√
【解析】本题属于考察Python异常处理。finally无论try中的代码是否引发异常,程序都会执行finally部分的代码,故说法正确。
10.global关键字只能用于自定义函数内,其功能是允许在函数内修改全局变量的值。
【答案】正确√
【解析】本题属于考察Python作用域的知识。global关键字只适用于在函数内部修改全局变量的值,如果需要在函数内部创建新的全局变量,不需要使用global关键字。故说法正确。
三、编程题(每题25分,共50分)
题号 | 1 | 2 |
答案 |
1、进制转换
【问题描述】
N进制数指的是逢N进一的计数制。例如,人们日常生活中大多使用十进制计数,而计算机底层则一般使用二进制。除此之外,八进制和十六进制在一些场合也是常用的计数制(十六进制中,一般使用字母A至F表示十至十五)。
在本题中,我们将给出N个不同进制的数。你需要分别把它们转换成十进制数。
【提示】
对于任意一个L位K进制数,假设其最右边的数位为第0位,最左边的数位为第L-1位,我们只需要将其第i位的数码乘以权值
,再将每位的结果相加,即可得到原K进制数对应的十进制数。下面是两个例子:
1.八进制数1362对应的十进制数为1×83+3×82+6×81+2×80=754;
2.十六进制数3F0对应的十进制数为3×162+15×161+0×160=1008。
【输入描述】
输入的第一行为一个十进制表示的整数N。接下来N行,每行一个整数K,随后是一个空格,紧接着是一个K进制数,表示需要转换的数。保证所有K进制数均由数字和大写字母组成,且不以0开头。保证K进制数合法。
保证N≤1000;保证2≤K≤16,保证所有K进制数的位数不超过9。
【输出描述】
输出N行,每一个十进制数,表示对应K进制数的十进制数值。
【样例输入1】
2
8 1362
16 3F0
【样例输出1】
754
1008
【样例输入2】
2
2 11011
10 123456789
【样例输出2】
27
12345679
【题目大意】
首先,输入要转换的行数,用N表示。接下来输入N行,每行格式为:K K进制数。将给出N个不同进制的数分别把它们转换成十进制数输出。
【解题思路】
本题主要考察内置函数,嵌套循环和进制转换的使用。
1.首先获取一个整数n。
2.进行n次循环,在每次循环中,将该行输入分割成两个部分k和st。k设置为一个整数,st是一个字符串。
3.将st逆序,遍历st中的每个字符,使用enumerate()函数将st组合为一个索引序列,同时列出数据ch和数据下标j。使用if语句根据字符的类型(数字或字母)计算出其对应的权重,并将这些权重乘以k的相应次方j,最后将所有的乘积相加得到结果ans。
【参考程序】

2、变长编码
【问题描述】
小明刚刚学习了三种整数编码方式:原码、反码、补码,并了解到计算机存储整数通常使用补码。但他总是觉得,生活中很少用到
-1这么大的数,生活中常用的0~100这种数也同样需要用4个字节的补码表示,太浪费了些。热爱学习的小明通过搜索,发现了一种正整数的变长编码方式。这种编码方式的规则如下:
1.对于给定的正整数,首先将其表达为二进制形式。例如,(0){10}=(0){2},
(926){10}=(1110011110){2}。
2.将二进制数从低位到高位切分成每组7bit,不足7bit的在高位用0填补。例如,(0){2}变为00000000一组,(1110011110){2}变为0011110和0000111的两组。
3.由代表低位的组开始,为其加入最高位。如果这组是最后一组,则在最高位填上0,否则在最高位填上1。于是,0的变长编码为00000000一个字节,926的变长编码为10011110和00000111两个字节。
这种编码方式可以用更少的字节表达比较小的数,也可以用很多的字节表达非常大的数。例如,987654321012345678的二进制为(0001101 1011010 0110110 1001011 1110100 0100110 1001000 0010110 1001110){2},于是它的变长编码为(十六进制表示)CE 96 C8 A6 F4 CB B6 DA 0D,共9个字节。你能通过编写程序,找到一个正整数的变长编码吗?
【输入描述】
输入第一行,包含一个正整数N。约定0≤N≤1018。
【输出描述】
输出一行,输出N对应的变长编码的每个字节,每个字节均以2位十六进制表示(其中,A-F使用大写字母表⽰),两个字节间以空格分隔。
【样例输入1】
0
【样例输出1】
00
【样例输入2】
926
【样例输出2】
9E 07
【样例输入3】
987654321012345678
【样例输出3】
CE 96 C8 A6 F4 CB B6 DA 0D
【题目大意】
输入一个正整数N,转换为二进制数,将二进制数从低位到高位切分成每组7bit,不足7bit的在高位用0填补。由代表低位的组开始,为其加入最高位。如果这组是最后一组,则在最高位填上0,否则在最高位填上1。最后转换为十六进制数输出。
【解题思路】
本题主要考察内置函数,for…else..语句和字符串方法的使用。
1.输入正整数N,使用bin()函数,转为二进制数并去掉二进制数的前缀,再赋值给N。
2.判断二进制N是否是7位,不是择在前面补0。
3.设置一个空列表bList,用来存放二进制数,使用for循环遍历N,每7位位一个列表项。
4.逆序存储在bList中,除了最后一个列表项,“1”+每个列表项。最后一项,“0”+每个列表项。
5.设置一个空字符串rst,遍历bList,使用int()函数将每个遍历元素(即列表项)转为10进制数,再使用hex()函数转为16进制数并使用字符串切片去除进制前缀“0x”。使用upper()函数将字母转为大写字母,使用zfill()函数在字符串的左侧填充零,直到达到指定的长度2。最后用空字符串分割。
6.去掉最后的空字符输出rst。
【参考程序】


END

GESP 12月认证
1-4级 2023年12月9日 上午9:30-11:30
5-8级 2023年12月9日 下午13:30-16:30
登录GESP官网(https://gesp.ccf.org.cn/)进行报名
1. GESP微信:关注“CCF GESP”公众号,将问题以文字方式留言即可得到回复。
2. GESP邮箱:gesp@ccf.org.cn
注:请在邮件中详细描述咨询的问题并留下考生的联系方式及姓名、身份证号,以便及时有效处理。
3. GESP电话:0512-67656856
咨询时间:周一至周五(法定节假日除外)
上午 8:30-12:00;下午 13:00-17:30
扫码关注GESP公众号,了解更多咨询

直播合作媒体:蔻享学术