
点击上方蓝字关注我们吧

CCF编程能力等级认证,英文名Grade Examination of Software Programming(以下简称GESP),由中国计算机学会发起并主办,是为青少年计算机和编程学习者提供学业能力验证的平台。GESP覆盖中小学全学段,符合条件的青少年均可参加认证。GESP旨在提升青少年计算机和编程教育水平,推广和普及青少年计算机和编程教育。
GESP考察语言为图形化编程、Python编程及C++编程,主要考察学生掌握相关编程知识和操作能力,熟悉编程各项基础知识和理论框架,通过设定不同等级的考试目标,让学生具备编程从简单的程序到复杂程序设计的编程能力,为后期专业化编程学习打下良好基础。
本次为大家带来的是2024年3月认证Python四级真题解析。
GESP2024年3月认证Python四级
一、单选题(每题2分,共30分)
|
题号 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
|
答案 |
C |
C |
D |
D |
D |
C |
A |
B |
C |
D |
D |
B |
D |
A |
A |
1、⼩杨的父母最近刚刚给他买了⼀块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是?( )
A.小程序
B.计时器
C.操作系统
D.神话人物
【答案】C
【解析】本题属于考察计算机基础知识。鸿蒙是操作系统,操作系统是管理计算机硬件与软件资源的程序,同时也是计算机系统的内核与基石。它提供了一个让用户与系统交互的界面,可以让用户更方便地使用计算机,同时也让应用程序的编写更为简单。
2、中国计算机学会(CCF)在2024年1⽉27⽇的颁奖典礼上颁布了王选奖,王选先⽣的重⼤贡献是( )。
A.制造自动驾驶汽车
B.创立培训学校
C.发明汉字激光照排系统
D.成立方正公司
【答案】C
【解析】王选院士是计算机文字信息处理专家,计算机汉字激光照排技术创始人,国家最高科学技术奖获得者,中国科学院学部委员、中国工程院院士,北京大学计算机研究所原所长。其主持研制的汉字激光照排系统用于书刊、报纸等正式出版物的编排,为新闻出版全过程的计算机化奠定了基础。
3、下面有关Python的说法,正确的是( )。
A. Python是低级程序设计语⾔,适合初学者
B. Python⼀门编译型语⾔
C.和C/C++、Java⼀样,Python也是静态类型的语⾔
D. Python是脚本型程序设计语⾔
【答案】D
【解析】本题属于考察编程语言基础知识。Python是一种高级编程语言,多范式编程语言,支持面向对象、命令式、函数式和过程式编程,属于脚本型程序设计语⾔。
4、有关Python语句print(3,2,sep='#')说法错误的是( )。
A. 3和2称之为位置参数
B. sep称之为命名关键字参数
C. 3和2称之为变参参数
D. sep参数可以放在3和2之前
【答案】D
【解析】本题属于考察Python内置函数print()函数参数的知识。
"变参参数"通常是指在函数定义中使用*args来收集任意数量的位置参数。在这个print函数调用中,函数依次接受任意数量的位置参数和一个关键字参数。因此3和2是位置参数,同时也是变参参数,传入几个位置参数都可以。在Python函数调用中,关键字参数(如sep='#')必须在位置参数(如3和2)之后。
5、下⾯Python代码执⾏后,第4⾏输出是( )。

A. [1, 2] [1, 2] [1, 2, 1, 2, 1, 2]
B. [1, 100] [1, 100] [1, 100, 1, 100, 1, 100]
C. [1, 100] [1, 2] [1, 2, 1, 2, 1, 2]
D. [1, 100] [1, 100] [1, 2, 1, 2, 1, 2]
【答案】D
【解析】本题考察的关键点是列表的赋值是引用传递,修改lstA也会影响lstB,但不会影响lstC,因为lstC是通过列表乘法创建的一个新列表,它与lstA的当前状态没有关联。
按执行顺序,在这段代码中,首先创建了一个列表lstA,然后创建了两个新列表lstB和lstC,lstB, lstC = [lstA, lstA * 3] ,其中lstA * 3 会创建一个新列表,lstA的内容重复三次组成,即[1, 2, 1, 2, 1, 2]。lstA作为一个元素赋值给lstB,所以lstB和lstA引用的是同一个列表对象[1, 2]。lstA[1] = 100 修改了lstA列表的第二个元素,所以lstA现在是[1, 100]。
print(lstA, lstB, lstC) 打印出修改后的lstA,以及lstB和lstC的内容。因为lstB是lstA的一个引用,所以lstB的内容也会显示为[1, 100]。lstC是在修改lstA之前创建的,因此它的内容仍然是[1, 2, 1, 2, 1, 2]。因此,正确答案是D。
6、下⾯Python代码最后执⾏后最后⼀⾏输出是( )。

A. [2, 6, 10, 14, 18] [1, 3, 5, 7, 9]
B. [1, 3, 5, 7, 9] [2, 6, 10, 14, 18]
C. [2, 6, 10, 14, 18] [2, 6, 10, 14, 18]
D. [1, 3, 5, 7, 9] [1, 3, 5, 7, 9]
【答案】C
【解析】本题属于考察Python函数参数、作用域的知识。lstA的初始值是[1, 3, 5, 7, 9],Foo(lstA)调用了函数Foo,并将lstA作为参数传入。
在Foo函数中,我们使用for i in range(len(lst)): 遍历列表的每个索引。
lst[i] *= 2 这行代码将列表lst中当前索引i的元素值翻倍并传入的列表lst(这里是lstA)。
函数完成后,返回修改后的列表lst,print(Foo(lstA), lstA) 打印了函数Foo的返回值和lstA的当前值。由于lstA在函数Foo中被修改,两者将打印相同的结果。由于lstA中的每个元素都被翻倍,结果列表将是[2, 6, 10, 14, 18]。因此,print(Foo(lstA), lstA) 输出的正确答案是C
7、下⾯Python代码执⾏后输出是( )。

A. 3 [1, 2, 3]
B. 3 3
C. [1, 2, 3] [1, 2, 3]
D. [1, 2, 3] 3
【答案】A
【解析】本题属于考察Python函数参数、作用域的知识。无论函数传递的参数的可变还是不可变,只要针对参数使用赋值语句,会在函数内部修改局部变量的引用,不会影响到外部变量的引用。在函数Foo内部,参数lst被重新赋值为传入列表的长度。由于传入的列表有三个元素,len(lst)的结果是3。函数Foo返回这个长度值3。
print(Foo(lst), lst) 语句将打印函数Foo的返回值和原始的lst列表。因此,正确答案是A
8、下⾯Python代码执⾏后输出是( )。
A. 3, 1
B. (3, 1)
C. 3
D.报错。因为第2⾏只能返回⼀个值,不可以是两个值
【答案】B
【解析】本题属于考察Python函数参数、作用域的知识。DIV函数定义了两个参数m和n,分别代表要进行除法运算的两个整数。return m // n, m % n执行结果是m除以n的商,只保留整数部分和m除以n的余数。当DIV(10, 3) 被调用时,它将m设置为10,n设置为3。10整除3 (10 // 3) 的结果是3,因为3乘以3等于9,是不超过10的最大的3的倍数。10除以3的余数(10 % 3) 是1,因为10减去9(3的3倍)等于1。要注意的是,如果返回多个参数,是将多个参数封装为tuple。因此,正确答案是B。
9、Python代码 print({(i,i ** 2) for i in range(5)}) 执⾏后可能输出是( )。
A. ((0, 0), (1, 1), (2, 4), (3, 9), (4, 16))
B. [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16)]
C. {(2, 4), (4, 16), (0, 0), (1, 1), (3, 9)}
D. {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
【答案】C
【解析】本题属于考察Python集合推导式。集合中的每个元素是一个元组,包含一个来自range(5)的数字i及其平方i ** 2。range(5)生成一个包含从0到4的整数序列。因此,对于这个序列中的每个数字i,都会计算i和i ** 2 并将它们作为一个元组放入集合中,即{(0, 0), (1, 1), (2, 4), (3, 9), (4, 16)},但是集合是无序的,所以当你运行代码时,输出的元组顺序可能与上述顺序不同。因此,正确答案是C。
10、下⾯Python代码执⾏,其输出是( )。

A. True True True True
B. True False False True
C. False False False False
D. True True False True
【答案】D
【解析】本题属于考察Python变量赋值及列表的浅拷贝。A is B检查的是A和B是否是同一个对象的引用,由于B被直接赋值为A,所以A is B 的结果是True。A == B检查的是A和B的值是否相等,由于B是A的一个引用,它们指向同一个列表,所以它们的值当然相等。A is C检查的是A和C是否是同一个对象的引用,C是通过A[:]创建的,这实际上是创建了A的一个浅拷贝。虽然C的内容与A相同,但C是一个新的列表对象,因此它们不是同一个对象的引用。A == C检查的是A和C的值是否相等。尽管C是一个新的列表对象,但它具有与A相同的元素。因此,正确答案是D
11、在Python中,对list、tuple或str类型执⾏in运算,其时间复杂度均为( )。
A. O(N)
B. O(N2)
C. O(1)
D. 非上述备选答案
【答案】D
【解析】本题属于考察冒泡算法复杂度的估算知识。在Python中,对于列表(list)、元组(tuple)类型执行in运算时,它们的时间复杂度通常是O(n),其中n是容器的长度。这是因为in运算符需要在这些数据结构中进行线性搜索来检查元素是否存在。但是对于字符串(str),情况就复杂很多,字符串的 in 运算符检查一个子字符串是否存在于一个更大的字符串中。这通常涉及一个更复杂的算法,如朴素的子字符串搜索的时间复杂度是O(nm),其中n是字符串的长度,m是子字符串的长度。然而,Python中可能使用了更高效的算法(如KMP或其他算法),这些算法在平均情况下可以提供接近O(n)的性能,但最坏情况下仍然可能是O(nm)。因此,正确答案是D。
12、下列Python代码⽤于寻找1~100之间的因数最多的数及其因数,程序本意是factor变量存储形如{6:[1,2,3,6],8: [1,2,4,8]}。下⾯有关说法正确的是()。
A. 程序第5⾏存在语法错误,因为append()的返回值为None
B. 程序第5⾏存在语法错误,当某个数第1次作为factor的key时,其对应的值为append()的返回值即None,当该数第2次作为factor的key时,factor.get(i,[])返回值为None不再是[],append()不能成其为函数
C. 程序第6⾏存在语法错误,因为max()不能有key参数
D. 程序第6⾏存在语法错误,max()虽然可以有key作为参数,但其中lambda函数存在语法错误
【答案】B
【解析】本题属于考察Python复合数据类型的嵌套知识。max()函数完全可以接受一个key参数,这是用于指定如何比较元素的。在这个例子中,key参数用于比较每个键值对中值的长度,即因数列表的长度。lambda x:len(x[1])是一个合法的lambda函数,它返回了每个键值对中值(因数列表)的长度,这样max()函数就可以根据因数最多的数来确定最大值。对于B,append()函数执行后的返回值为None,并赋值给factor[i],因此,题目中的描述正确,正确答案是B。
13、在如下Python代码中,假设变量zen代表很多字符此处仅为⽰例,代码实现按⼩写字母频次升序,如频次相同则按字符ASCII升序输出,横线处应填入是( )。

A. alphaCount[c]+= 1
B. alphaCount[c.lower()]+= 1
C.alphaCount[c.lower]= alphaCount.get(c.lower,0)+ 1
D. alphaCount[c.lower()]= alphaCount.get(c.lower0,0)+ 1
【答案】D
【解析】本题属于考察Python复合数据类型的嵌套,lambda表达式和。选项A中的alphaCount[c] += 1没有考虑到字母的大小写。选项B中的alphaCount[c.lower()] += 1正确地将字符转换为小写,但是这行代码在alphaCount字典中不存在键c.lower()时会引发KeyError。C中的alphaCount[c.lower] = alphaCount.get(c.lower,0) + 1存在两个问题:首先,它使用了c.lower而不是c.lower(),这意味着它尝试获取函数lower的引用而不是调用该函数;其次,它错误地使用了赋值而不是增加操作。因此,正确答案是D
14、下⾯Python代码能正确执⾏。在代码被执⾏之前,abc.txt已经存在,其⽂件字节数为100。下⾯有关说法, 正确的是( )。

A. abc.txt的内容将被覆盖,但由于没有写⼊操作,⽂件字节数为0
B. abc.txt的内容不会被覆盖,因为没有执⾏任何⽂件写⼊操作,abc.txt将继续原样存在
C.原abc.txt的内容将被复制到abc.bak之中,然后覆盖abc.txt,由于没有写⼊操作,因此⽂件字节数为0
D. abc.txt将被删除,因为第⼀⾏代码执⾏后,原⽂件内容将被删除,但由于没有写⼊操作,因此abc.txt将不会存在
【答案】A
【解析】本题属于考察计算机文件操作知识,写入模式("w")打开一个文件时,如果文件已经存在,其内容会被立即清空。因此,当执行open("abc.txt", "w")这行代码时,abc.txt文件里原有的内容将被清空。由于在wFile.close()之前没有进行任何写入操作,文件的大小将是0字节。因此,abc.txt的内容将被覆盖,文件大小为0字节。因此,正确答案是A
15、下列Python代码执行后,将输出的是( )

A. 0#2#
B. 0#1#2#
C. 1#2#
D. 0#
【答案】A
【解析】本题属于考察函数定义和调用。print(10/0) # =会直接触发ZeroDivisionError异常。print(0, end="#") # 因为捕获到了ZeroDivisionError,所以这里会打印0#,print(2, end="#") # finally 块总是会被执行,所以这里会打印2#。因此,正确答案是A
二、判断题(每题2分,共20分)
|
题号 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
|
答案 |
√ |
√ |
× |
× |
√ |
√ |
√ |
× |
√ |
√ |
1、何⼀个for循环都可以转化为等价的while循环。( )
【答案】√
【解析】for循环和while循环是两种基本的循环结构,它们在功能上是等价的,意味着任何使用for循环编写的算法都可以使用while循环来重写。
2、⼩杨今年春节回奶奶家了,奶奶家的数字电视要设置ip地址并接⼊到WIFI盒⼦才能收看节⽬,那这个WIFI盒
⼦具有路由器的功能。( )
【答案】√
【解析】所谓的"WIFI盒子"通常指的是无线路由器,它能够提供无线网络接入点,让周围的设备如电视、手机、电脑等通过无线方式连接到互联网。
3、⼩杨在练习Python准备GESP考试的过程中,发现如果执⾏import os,可以通过os.system()启动外部程序,因此也可以说Python是⼀个⼩型操作系统。( )
【答案】×
【解析】虽然Python的os模块提供了许多与操作系统交互的功能,例如os.system()函数可以用来运行操作系统的命令,但这并不意味着Python本身是一个操作系统。
4、在Python中,任何⼀个while循环都可以转化为等价的for循环( )。
【答案】×
【解析】while循环和for循环在许多情况下可以互相转换,因为它们都是用来重复执行一段代码直到满足特定条件为止。但是并不是所有的while循环都可以转换为等价的for循环,有些基于复杂条件或动态条件的while循环不能直接转换为for循环。
5、在Python中,list类型有sort()函数,但tuple、set和dict则没有sort()函数。( )
【答案】√
【解析】在Python中,list类型确实有一个sort()方法,该方法用于原地排序列表,不返回任何值(返回None),而其他几个函数没有sort()方法。
6、当对list和tuple类型执⾏in运算时,其时间复杂度为O(N)。( )
【答案】√
【解析】对于list和tuple类型,执行in运算(即成员资格测试)时,Python会按顺序遍历整个列表或元组来检查是否包含指定的元素。这个操作的平均时间复杂度是O(N),其中N是列表或元组中元素的数量。
7、在Python中,[i*2 for i in range(10) ]*3 是合法的表达式。( )
【答案】√
【解析】[i*2 for i in range(10)]*3 是一个合法的表达式,包含了两部分:列表推导式[i*2 for i in range(10)]和*3:这个操作会将列表重复3次,因此,这个表达式首先计算出一个包含10个元素的列表并重复3次.
8、在下⾯Python代码中,⽂本⽂件abc.txt共有10⾏,每⾏由1个英⽂半角字母组成。第5⾏代码执⾏后其输出为10。( )

【答案】×
【解析】文件的总内容将包括10个英文半角字母和9个换行符,因为最后一行可能没有换行符,总共会有19个字符
9、在Python中,已执行tpl = ([1,2],[3,4],[5,6]) ,如果执行tpl[1] = [99,100] 将报错,而执行tpl[1][1] = [99,100] 则不会报错。( )
【答案】√
【解析】tpl是一个元组,元组是不可变的数据类型,但元组中包含列表时可以修改,给定的代码tpl = ([1,2], [3,4], [5,6]) 创建了一个包含三个列表的元组。尝试修改元组中的一个元素,如tpl[1] = [99,100],将会导致类型错误,因为不能改变元组tpl中的元素。但是可以修改元组中列表的内容,因为列表是可变的。所以,执行tpl[1][1] = [99,100] 将会成功
10、在Python中,表达式len(set("China")^set("china"))的值为2。( )
【答案】√
【解析】set("China")和set("china")分别创建了两个集合。集合中的元素是唯一的,且集合是无序的。字符串"China"和"china"中的字母被转换成集合时,大小写是区分的。使用^运算符,也称为对称差集,会得到两个集合中不重叠的元素组成的新集合。在这个例子中,'C'和'c'是不重叠的元素,因为集合是区分大小写的。因此,set("China")^set("china")的结果是{'C', 'c'}。这个新集合的长度是2
三、编程题(每题25分,共50分)
|
题号 |
1 |
2 |
|
答案 |
1、相似字符串
题面描述
对于两个字符串A和B,如果A可以通过删除一个字符,或插入一个字符,或修改一个字符变成B,那么我们说A和B是相似的。
比如apple可以通过插入一个字符变成applee,可以通过删除一个字符变成appe,也可以通过修改一个字符变成bpple,因此apple和applee、appe、bpple都是相似的。但applee并不能通过任意一个操作变成bpple,因此它们并不相似。
特别地,完全相同的两个字符串也是相似的。
给定T组A,B,请你分别判断他们是否相似。
输入描述
第一行一个正整数T。
接下来T行,每行两个用空格隔开的字符串A和B。保证T≤100,A,B的长度不超过50。保证A和B只包含小写字母。
输出描述
输出T行,对于每组A,B,如果它们相似,则输出similar,否则输出not similar。
特别提醒
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。
样例输入1

样例输出1

【题目大意】
题目要求输入T组字符串和B,判断两个字符串A和B是否相似。如果A可以通过删除一个字符、插入一个字符或修改一个字符变成B,那么A和B是相似的。根据判断结果输出"similar"或"not similar"。
【解题思路】
1.比较两个字符串的长度,如果长度差大于1,则直接返回False,因为这种情况下无法通过单一操作使得两个字符串相似。
2.如果两个字符串长度相等,那么遍历两个字符串,统计不同字符的个数。如果不同字符的个数小于等于1,则可以通过修改一个字符使得两个字符串相似,返回True。
3.如果两个字符串长度不等,那么分别标记较短和较长的字符串为shorter和longer。然后同时遍历两个字符串,使用两个指针i和j分别代表shorter和longer的索引。如果两个索引指向的字符不同,则longer字符串的指针j前进一步,shorter字符串的指针i保持不变,这代表尝试在shorter中插入一个字符或在longer中删除一个字符。如果字符相同,则两个指针都前进一步。如果在任何时候不同字符的个数超过1,则返回False。
4.如果所有的条件判断都通过,则返回True,表示字符串A和B是相似的。
【参考程序】

2、做题
问题描述
小杨同学为了提高自己的实力制定了做题计划,在第k天时,他必须要完成k道题,否则他就会偷懒。
小杨同学现在找到了一个题库,一共有"套题单,每一套题单中有一定数量的题目。但是他十分挑剔,每套题单他只会使用一次,每一天也只能使用一套题单里的题目,之后那套题单就会被弃之不用。对于每套题单,他不必完成题单内所有的题。
那么问题来了,小杨同学最多会做题几天才偷懒呢?
输入格式
第一行,1个数为n,表示有多少套题单。
第二行,n个整数a1,a2....,an,分别表示每套题单有多少道题。
输出格式
输出一行,小杨同学偷懒前最多做题天数。
样例1

对于全部数据,保证有1 ≤ n ≤ 106,1 ≤ai≤ 109。
【题目大意】
这个题目是一个关于贪心算法的应用问题。第一行输入一个整数n,表示题库中题单的总数。第二行输入n个整数,每个整数代表一套题单中题目的数量。最后输出一个整数,表示小杨最多能连续做题的天数。
【解题思路】
1.输入题单总数n。
2.输入每套题单的题目数量,并存入列表A。
3.对列表A进行排序,以便能够优先使用题目数量少的题单。
4.初始化day为1,表示第一天,初始化idx为0,表示题单的索引。
5.使用while循环,条件为idx小于n,循环体内进行如下操作:--检查当前题单的题目数量是否满足当天需要解决的题目数量,即A[idx]是否大于等于day。--如果满足,day加1,表示小杨可以进入下一天继续做题。--不管是否满足,都将idx加1,表示将考虑下一套题单。
6.循环结束后输出day - 1,因为在最后一次循环中,day被多加了1,所以需要减去。
【参考程序】

技术支持:赵询
策划:GESP技术委员会副主席 刘晓庆




1. GESP微信:关注“CCF GESP”公众号,点击“GESP小助手”即可交流。
2. GESP邮箱:gesp@ccf.org.cn
注:请在邮件中详细描述咨询的问题并留下考生的联系方式及姓名、身份证号,以便及时有效处理。
3. GESP电话:0512-67656856
咨询时间:周一至周五(法定节假日除外)上午 8:30-12:00;下午 13:00-17:30
扫码关注GESP公众号,了解更多资讯

