CCF-GESP 等级考试 2025年6月认证Python三级真题解析
1 单选题(每题 2 分,共 30 分)
第1题 2025年4月19日在北京举行了一场颇为瞩目的人形机器人半程马拉松赛。比赛期间,跑动着的机器人会利用 身上安装的多个传感器所反馈的数据来调整姿态、保持平衡等,那么这类传感器类似于计算机的( )。
A. 处理器 B. 存储器 C. 输入设备 D. 输出设备
解析:答案:C。所有传感器都用于采集数据,属于输入设备,故选C。
第2题 小杨购置的计算机使用一年后觉得内存不够用了,想购置一个容量更大的内存条,这时需要的内存条是( )。
A. RAM B. ROM C. CACHE D. EPROM
解析:答案:A。内存条属于随机存储器(RAM)。ROM为只读存储器,数据只能读不能写,不能发内存条使用,错误。CACHE为高速缓存,一般集成在CPU中,不能当内存条使用,EPROM为可编程只读存储器,正常情况下只读,相当于ROM,在特定条件下可改写内容,如固化程序、数据等,也不能当内存条使用。故选A。
第3题 下列哪个Python表达式能正确将十六进制数?( )
A. int('2A', 10) B. int('2A', 16) C. bin(0x2A) D. hex(42)
解析:答案:B。int()有至少三种功能,单参数:数据为浮点数则将此浮点数转换为整数,数据为字符串(不能含小数)则将此字符串按十进制转换为整数。双参数,第1参数必须为字符串,第2个参数为整数表示进制,A.将"2A"按十进制转换为十进制,会报错("A"为非十进制数)。B.将"2A"按十六进制转换为十进制,正确。bin()将一整数转换为二进制,hex()将一整数转换为十六进制。故选B。
第4题 执行下面Python代码后,输出的结果是?( )
- fruits = ['apple', 'banana', 'cherry']
- fruits.append('orange')
- fruits.insert(1, 'grape')
- print(fruits)
A. ['apple', 'grape', 'banana', 'cherry', 'orange']
B. ['apple', 'banana', 'grape', 'cherry', 'orange']
C. ['apple', 'grape', 'banana', 'cherry']
D. ['apple', 'grape', 'orange', 'banana', 'cherry']
解析:答案:A。append()是尾部添加,'orange'添加在'cherry'后,insert()为插入,在索引1('apple'后)插入'grape'。故选A。
第5题 执行下面Python代码后,输出的结果是?( )
- numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- result = numbers[2:7:2] + numbers[-3::-3]
- print(result)
A. [2, 4, 6, 7, 4] B. [2, 4, 6, 6, 3, 0] C. [2, 4, 6, 7, 4, 1] D. [2, 4, 6, 7, 4, 1, 0]
解析:答案:C。numbers[2:7:2]从索引2开始步长为2到索引7(不含)为[2,4,6],numbers[-3::-3]从索引-3开始步长为-3到索引0(含)为[7,4,1],result为[2,4,6]+[7,4,1]= [2,4,6,7,4,1]。故选C。
第6题 关于Python元组,以下说法错误的是?( )
A. 元组是不可变的数据类型 B. 元组可以作为字典的键
C. 元组支持切片操作 D. 元组中的元素可以被重新赋值
解析:答案:D。元组为不可变数据类型,元素不可更改,不可变数据类型可作字典的键,元组作为序列支持切片操作,所以D错误。故选D。
第7题 执行下面Python代码后,输出的结果是?( )
- print((1, 2, 3) < (1, 2, 4))
A. True B. False C. 报错 D. None
解析:答案:A。序列比较,先比较第1个元素,第1个元素相同再比较第2个元素,以此类推,直到最后一个元素。对本题,第1个元素、第2个元素都相同,第3个元素3<4成立,所以结果为True。故选A。
第8题 关于字典的 .get() 方法,以下说法错误的是?( )
A. 当键不存在时,.get()方法可以返回 None
B. .get() 方法可以设置默认返回值
C. .get() 方法比直接使用 [] 访问更安全
D. .get() 方法会修改原字典
解析:答案:D。字典的 .get() 方法是获取键的值,可设置默认返回值作为键不存在时的返回值,如不设置默认返回值,则键不存在时返回None,用dict.get(key)比直接使用dict[key]访问更安全,所以D错误。故选D。
第9题 以下哪个字典推导式能正确将列表 ['Python', 'Java', 'C++'] 转换为 {'Python':6, 'Java':4, 'C++':3} (字符串作为键,长度作为值)?( )
A. {len(x): x for x in ['Python', 'Java', 'C++']}
B. {x: len(x) for x in ['Python', 'Java', 'C++']}
C. {x: x.length() for x in ['Python', 'Java', 'C++']}
D. {x: size(x) for x in ['Python', 'Java', 'C++']}
解析:答案:B。Python求字符串长度的函数为len(),字符串没有.length()方法,也没有size(),C.、D.错误,A.长度为键、值为列表元素,不合题意。所以B正确。故选B。
第10题 执行下面Python代码后,输出的结果是?( )
- s = " Hello, World! "
- result = s.strip().lower().replace('world', 'Python').capitalize()
- print(result)
A. Hello, python! B. Hello, Python! C. hello, python! D. hello, Python!
解析:答案:A。在 Python 中,.strip() 是一个字符串方法,用于移除字符串开头和结尾的指定字符(默认为空白字符)。.lower() 是一个字符串方法,用于将字符串中的字母转换为小写。.replace() 是一个字符串方法,用于字符串中的“原子串”替换为“新子串”。.capitalize()是一个字符串方法,用于把字符串首字母改为大写,其他字母为小写,非字母字符不变。语句2将s字符串的首尾空格去掉,转为小写,将"world"替换为"Pyhon",然后首字母改大写其他字母改小写,所以result的值为"Hello, python!"。故选A。
第11题 执行下面Python代码后,输出的结果是?( )
s = "one,two,three"
parts = s.split(',')
new_s = '-'.join([p[:2] for p in parts])
print(new_s)
A. o-t-t B. one-two-three C. on-tw-th D. one,two,three
解析:答案:C。在 Python 中,.split() 是一个字符串方法,用于用指定分隔符将字符拆分为列表。字符串.join()用字符串连接列表中的字符串元素。列表推导式[p[:2] for p in parts]生成parts元素前2个字符为元素列表,综合为用“-”连接s串中用“,”分隔子串中的前两个字符,所以C.符合。故选C。
第12题 以下哪个操作会修改集合 s = {1, 2, 3} 的内容?( )
A. s.union({4, 5}) B. s.difference({1})
C. s.intersection_update({2, 3}) D. s.issubset({1, 2, 3, 4})
解析:答案:C。在 Python 中,s.union() 是一个集合方法,用于“并”运算指定集合返回一个并一个“并”的新集合,但并不修改集合s。s. difference() 是一个集合方法,用于“差”运算指定集合返回一个“差”后的新集合,但并不修改集合s。s.intersection_update()是一个集合方法,用于“交”运算指定集合并更新原集合,即修改集合s。.issubset()是一个集合方法,用于判断集合是否是指定集合的子集,并不修改集合s。所以只有C.的操作会修改集合s。故选C。
第13题 执行下面Python代码后,输出的结果是?( )
A. {1, 2, 3, 4, 5} B. {1, 2, 4, 5} C. {3} D. set()
- set1 = {1, 2, 3}
- set2 = {3, 4, 5}
- print(set1 ^ set2)
解析:答案:B。^是集合的差分运算符,去掉两个集合的公共部分再合并。第1、2行两个集合的公共元素为{3},所以运算结果中不含元素{3}。故选B。
第14题 下列哪个选项可以将字符串 "hello" 转换为列表 ['h', 'e', 'l', 'l', 'o'] ?( )
A. list("hello") B. "hello".split() C. "hello".to_list() D. ["hello"]
解析:答案:A。list()函数可以将字符串转换为每个字符为元素的列,A.正确。.split()为字符串方法,可以将字符串按指定字符拆分为列,"hello".split()是按空白字符作分隔符进行拆分,"hello"中无空白字符,结果为["hello"],所以B.错误。Python中字符串无.to_list()方法,C.错误。["hello"]的结果仍是["hello"],D.错误。故选A。
第15题 凯撒加密是一种经典的加密方法,它通过将字母表中的每个字母按照固定的位移量进行替换来实现加密。 例如,当位移量为1时:
- a→b, b→c, ..., y→z
- z→a (循环回到字母表开头)
- 其他字符(如大写字母、数字、符号等)保持不变
现在需要实现一个凯撒加密程序,具体要求如下:
- 只对小写字母进行加密
- 位移量为1
- 非小写字母字符保持原样不变
- 加密后的字符需要保持原始的大小写格式
请补全下面代码中的空白处,使其能够正确实现上述加密功能:
text = input("请输入要加密的字符串:")
encrypted = []
for char in text:
if char.islower():
code = ord(char) # 获取字符的ASCII码
new_code = (________) % 26 + ord('a') # 填空处
encrypted.append(chr(new_code))
else:
encrypted.append(char)
print("加密结果:", ''.join(encrypted))
A. code - ord('a') + 1 B. code + 1 C. ord(char) + 1 D. (code - ord('a')) * 2
解析:答案:A。code - ord('a')可以将小写字母转换为0~25,+1为偏移量,,%26将偏移后的数字仍为0~25,如25(z)+1=26%26=0(a),A.正确。B.、C.结果相同,则不可能是答案,D.的code - ord('a')可以将小写字母转换为0~25,*2无意义。故选A。
2 判断题(每题 2 分,共 20 分)
第1题 现在,人们参加各种闭卷考试时通常都不允许将智能手机、平板电脑等带入考场,因为智能手表通常都有嵌 入操作系统及通信等功能,所以也不允许携带入考场。( )
解析:答案:正确。智能手表因为具有嵌入操作系统及通信等功能,通讯功能风险:1.智能手表普遍具备蓝牙、Wi-Fi或蜂窝网络功能,可实现实时信息收发(如接收答案、传输试题),即使关机或断网,其硬件模块仍存在作弊隐患。2.信息存储与计算能力:可存储公式、文档、图片等考试相关资料,或内置计算器、单位换算等工具,违反"仅依靠知识储备答题"的原则。3.隐蔽性高,监管困难:部分智能手表外观与普通手表相似,监考人员难以快速甄别功能;其屏幕切换、震动提醒等特性可能用于传递作弊信号,所以也不允许随身携带。故正确。
第2题 执行下面Python代码后,输出的结果是 True。( )
- x = 15
- y = 7
- print((x ^ y) < (x & y))
解析:答案:错误。x=15=(0000 1111)₂,y=7=(0000 0111)₂。x ^ y =(0000 1111)₂ ^ (0000 0111)₂= (0000 1000)₂=8,x & y=(0000 1111)₂ & (0000 0111)₂= (0000 0111)₂=7,所以(x ^ y) < (x & y)=8<7不成立,输出False。故错误。
第3题 表达式 ~0b0011 << 2 的结果是 -0b1100 (即十进制 -12 )。( )
解析:答案:错误。~0b0011=0b11...1100,~0b0011 << 2 = 0b11...110000=-0b10000=-16。故错误。
第4题 若用枚举算法解决"密码锁破解"问题,则十进制3位数字密码最多需要尝试1000次就一定能打开。( )
解析:答案:正确。十进制3位数字密码,每位有10种可能,枚举3位需要的次数为10×10×10=1000,所以最多需要尝试1000次就一定能破解密码。故正确。
第5题 执行下面Python代码后,会将列表 a 的前两个元素替换为 [10, 20] 。
- a = [1, 2, 3, 4, 5]
- a[:2] = [10, 20]
- print(a)
解析:答案:正确。a[:2]=[10,20],表示a的索引为0、1两个元素替换10、20,a=[10,20,3,4,5],所以会将列表a的前两个元素替换为[10, 20]。故正确。
第6题 使用 update() 方法合并字典时,如果键重复,新值会覆盖旧值。
解析:答案:正确。字典的update()方法,可用字典更新另一字典,如果键已存在则更新,如键不存在则添加键值对。所以使用update()方法合并字典时,如果键重复,新值会覆盖旧值的说法正确。故正确。
第7题 执行下列Python代码,输出的结果是 2。
- t = (1, 2, 3) * 2
- print(len(t))
解析:答案:错误。序列的乘法运算为序列元素重复多少次,t=(1, 2, 3) * 2=(1,2,3,1,2,3),所以len(t)=6,不是2。故错误。
第8题 Python代码 set1 = {1, 2, 3}; set1.remove(4) 能正常执行,且 set1 保持不变。
解析:答案:错误。因为set1={1, 2, 3},set1.remove(4)因set1中不存在元素4而报错,所以代码不能正常执行。故错误。
第9题 在Python中,字符串是不可变对象,因此执行 s = "hello"; s[0] = "H" 会导致程序报错。
解析:答案:正确。因为字符串s是不可变对象,s[0]="H"试图改变s的第1个字符,而导致程序报错。故正确。
第10题 在Python中使用 list({"a": 1, "b": 2}) 可以将字典 {"a": 1, "b": 2} 转换为 [("a", 1), ("b", 2)] 。
解析:答案:错误。默认字典转换只包括键,而不是键值对,相当于dict.keys(),要得到题目所给的结果,需用list({"a": 1, "b": 2}.items()),所以错误。故错误。
3 编程题(每题 25 分,共 50 分)
3.1 编程题1
- 试题名称:奇偶校验
- 时间限制:3.0 s
- 内存限制:512.0 MB
3.1.1 题目描述
数据在传输过程中可能出错,因此接收方收到数据后通常会校验传输的数据是否正确,奇偶校验是经典的校验方式 之一。
给定n个非负整数c₁,c₂,...,cₙ代表所传输的数据,它们的校验码取决于这些整数在二进制下1的数量之和的奇偶性。如果这些整数在二进制下共有奇数个1,那么校验码为1;否则校验码为0。你能求出这些整数的校验码吗?
3.1.2 输入格式
第一行,一个正整数 ,表示所传输的数据量。
第二行,n个非负整数c₁,c₂,...,cₙ,表示所传输的数据。
3.1.3 输出格式
输出一行,两个整数,以一个空格分隔:
第一个整数表示c₁,c₂,...,cₙ在二进制下 的总数量;
第二个整数表示校验码(0或1)。
3.1.4 样例
3.1.4.1 输入样例1
- 4
- 71 69 83 80
3.1.4.2 输出样例1
- 13 1
3.1.4.3 输入样例2
- 6
- 1 2 4 8 16 32
3.1.4.4 输出样例2
- 6 0
3.1.5 数据范围
对于所有测试点,保证1≤n≤100,1≤cᵢ≤255。
3.1.6 编写程序思路
分析:本题目主要考察位运算,c & 1为1表示c为奇数,c & 1为0表示c为偶数。要统计一个数对应二进制中1的个数,方法有多种,这里给两种。方法一:可以用c & 1获得c对应二进制的最后一位,加c & 1即这位是1则加1,否则加0,然后将该数右移1一位,丢掉最后一位,直至该数为0结束。方法二:可以用 c =c & (c - 1)去掉c中对应二进制中最右边的1,直至c=0结束,能运算c = c & (c - 1)的次数即为c对应二进制中1的个数。方法三:将数据转换为二进制字符串,加切片做。
用方法一编程参考程序:
n = int(input()) #随后将输入的数据个数
cin = [int(i) for i in input().split()] #列表推导式将输入数据转换为整数并转为列表
cnt = 0
for c in cin:while c:cnt += c & 1 #也可用cnt += c % 2c >>= 1
print(cnt, cnt % 2) #cnt % 2偶数为0,奇数为1
用方法二编程参考程序:
n = int(input()) #随后将输入的数据个数
cin = [int(i) for i in input().split()] #列表推导式将输入数据转换为整数并转为列表
cnt = 0
for c in cin:while c:c = c & (c - 1) #将c对应的二进制最右边的1改为0cnt += 1 #计数cnt加1
print(cnt, cnt % 2) #cnt % 2偶数为0,奇数为1
用方法三编程参考程序:
n = int(input()) #随后将输入的数据个数
cin = [int(i) for i in input().split()] #列表推导式将输入数据转换为整数并转为列表
cnt = 0
for c in cin:ci = bin(c)[2:] #去掉'ob'cnt += ci.count('1') #计数cnt加ci中1的个数
print(cnt, cnt % 2) #cnt % 2偶数为0,奇数为1
3.2 编程题2
- 试题名称:分糖果
- 时间限制:3.0 s
- 内存限制:512.0 MB
3.2.1 题目描述
有n位小朋友排成一队等待老师分糖果。第i位小朋友想要至少aᵢ颗糖果,并且分给他的糖果数量必须比分给前一位小朋友的糖果数量更多,不然他就会不开心。
老师想知道至少需要准备多少颗糖果才能让所有小朋友都开心。你能帮帮老师吗?
3.2.2 输入格式
第一行,一个正整数n,表示小朋友的人数。
第二行,n个正整数a₁,a₂,...,aₙ,依次表示每位小朋友至少需要的糖果数量。
3.2.3 输出格式
输出一行,一个整数,表示最少需要准备的糖果数量。
3.2.4 样例
3.2.4.1 输入样例1
- 4
- 1 4 3 3
3.2.4.2 输出样例1
- 16
3.2.4.3 输入样例2
- 15
- 314 15926 53589793 238462643 383279502 8 8 4 1 9 7 1 6 9 3
3.2.4.4 输出样例2
- 4508143253
3.2.5 数据范围
对于所有测试点,保证1≤n≤1000,1≤aᵢ≤10⁹。
3.2.6 编写程序思路
分析:根据题意,第i人,除了至少给该人期望的糖果数,还必须比前一人多(至少多1颗),故第i人应该给的糖果数为两者中大的那个数。算法可以用max(),也可以用列表。
方法一(用max()函数):第i人应该给的糖果数为max(cin[i-1]+1,cin[i]),cin[i-1]为前一人给的糖果数,而cin[i]则是该人期望的糖果数(输入的数值)。对第1个人期望的糖果数(输入的数值)。
n = int(input()) #小朋友数量。随后将输入的数据个数
cin = [int(i) for i in input().split()] #用列表推导式将输入数据转换为整数列表
for i in range(1,len(cin)):cin[i] = max(cin[i - 1] + 1, cin[i]) #比前一位小朋友多1与当前,两者取大者
print(sum(cin)) # 输出求和值,如果不会用sum()函数,则可用循环累加求和
方法二(用if条件):第i人应该给的糖果数cin[i]=max(cin[i-1]+1,cin[i]),即当cin[i]>cin[i-1],cin[i]便是该人期望的糖果数(输入的数值),否则当cin[i]<=cin[i-1],cin[i-1]+1为该人期望的糖果数(输入的数值)。对第1个人的前一人给的糖果数为0,cin[1]即为第1人期望的糖果数。完整程序如下:
n = int(input()) #小朋友数量。随后将输入的数据个数
cin = [int(i) for i in input().split()] #用列表推导式将输入数据转换为整数列表
for i in range(1,len(cin)):if cin[i] <= cin[i - 1]: #如果小于等于前一位小朋友cin[i] = cin[i - 1] + 1 #比前一位小朋友多1(必须比前一位更多)
print(sum(cin)) # 输出求和值,如果不会用sum()函数,则可用循环累加求和