当前位置:首页>python>GESP第12次认证真题解析|Python六级真题回顾

GESP第12次认证真题解析|Python六级真题回顾

  • 2026-09-10 07:41:00
GESP第12次认证真题解析|Python六级真题回顾

点击上方蓝字·关注我们

CCF编程能力等级认证,英文名Grade Examination of Software Programming(以下简称GESP),由中国计算机学会发起并主办,是为计算机和编程学习者提供学业能力验证的平台。GESP旨在提升青少年计算机编程能力,培训机构编编程教育水平,推广和普及计算机和编程教育。

GESP考察语言为图形化(Scratch)编程、Python编程及C++编程,主要考察学生掌握相关编程知识和操作能力,熟悉编程各项基础知识和理论框架,通过设定不同等级的考试目标,让学生具备编程从简单的程序到复杂程序设计的编程能力,为后期专业化编程学习打下良好基础。

本次为大家带来的是2025年12月Python六级认证真题解析。

Python六级

2025年12月

一、单选题(每题2分,共30分)

题号

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

答案

C

C

B

A

B

B

C

A

B

B

A

C

B

B

B

1、在Python的面向对象编程中,下列关于“动态绑定(等效于虚函数)”的描述中,错误的是( )。

A. 动态绑定用于支持运行时多态。

B. 通过基类变量调用方法时,会根据对象实际类型决定调用版本。

C. 构造函数(__init__)可以通过动态绑定实现多态以支持灵活初始化。

D. 基类析构函数(__del__)常保证子类调用其实现,以避免资源泄漏析构函数常声明为虚函数以避免资源泄漏。

【参考答案】C

【考纲知识点】面向对象编程(动态绑定、构造函数与析构函数特性)

【解析】

在Python中,构造函数(__init__)本身并不是通过动态绑定来实现多态的,创建对象时是直接调用对应类的__init__。

2、执行如下代码,将输出 钢琴:叮咚叮咚 和 吉他:咚咚当当 而不是两行 乐器在演奏声音,这体现了面向对象编程的( )特性。

A.继承

B.封装

C.多态

D.链接

【参考答案】C

【考纲知识点】面向对象编程(多态的实现与表现)

【解析】

代码中基类Instrument定义了play方法,子类Piano和Guitar重写了该方法。当通过基类变量(列表中的元素)调用play方法时,实际调用的是子类重写后的方法,因此输出子类特定的内容,体现了运行时多态。

3、执行下面代码,将输出( )。

A.

钢琴:叮咚叮咚

吉他:咚咚当当

B.

乐器在演奏声音

乐器在演奏声音

C.编译错误

D.运行错误

【参考答案】B

【考纲知识点】面向对象编程(方法调用的静态绑定与动态绑定)

【解析】

在Python中,通过类名直接调用方法(如Instrument.play(inst))属于静态绑定,此时传递的实例inst作为self参数传入,但方法体使用的是Instrument类中定义的play方法,而不是子类重写的方法。因此,无论inst是Piano还是Guitar实例,都会执行Instrument.play,输出两行“乐器在演奏声音”。

4、某文本编辑器把用户输入的字符依次压入栈S。用户依次输入A,B, C,D后,用户按了两次撤销(每次撤销,弹出栈顶一个字符)。此时栈从栈底到栈顶的内容是:( )。

A. A B

B. A B C

C. A B D

D. B C

【参考答案】A

【考纲知识点】数据结构(栈的基本操作与后进先出特性)

【解析】

输入顺序为A, B, C, D,栈顶为D。第一次撤销弹出D,栈中剩余A, B, C;第二次撤销弹出C,栈中剩余A, B。因此栈底到栈顶为A B。

5、假设循环队列数组长度为N,其中队空判断条件为:front == rear,队满判断条件为:(rear + 1) % N == front,出队对应的操作为:front = (front + 1) % N,入队对于的操作为:rear = (rear + 1) % N。循环队列长度N = 6,初始front = 1,rear = 1,执行操作序列为:入队,入队, 入队,出队, 入队,入队,则最终 (front, rear) 的值是( )。

A. (2, 5)

B. (2, 0)

C. (3, 5)

D. (3, 0)

【参考答案】B

【考纲知识点】数据结构(循环队列的指针移动与模运算)

【解析】

初始:front=1, rear=1入队×3:rear依次变为2, 3, 4出队×1:front变为2入队×2:rear依次变为5, 0(模6)最终:front=2, rear=0

6、以下函数check()用于判断一棵二叉树是否为( )。

A.满二叉树

B.完全二叉树

C.二叉搜索树

D.平衡二叉树

【参考答案】B

【考纲知识点】数据结构(完全二叉树的判断方法)

【解析】

该函数通过层序遍历判断二叉树是否为完全二叉树:若在遇到空节点之后又遇到非空节点,则不是完全二叉树。完全二叉树要求最后一层节点从左到右连续排列。

7、以下代码实现了二叉树的( )。

A.前序遍历

B.中序遍历

C.后序遍历

D.层序遍历

【参考答案】C

【考纲知识点】数据结构(二叉树的遍历方式)

【解析】

遍历顺序为:左子树 → 右子树 → 根节点,符合后序遍历的定义。

8、下面代码实现了哈夫曼编码,则横线处应填写的代码是( )。

A.

B.

C.

D.

【参考答案】A

【考纲知识点】数据结构(哈夫曼树的构建与节点合并)

【解析】

哈夫曼树构建过程中,合并两个节点生成新节点,其权值为两子节点权值之和,左右孩子分别为x 和y,新节点应加入内部节点队列internal_idx。

9、以下关于哈夫曼编码的说法,正确的是( )。

A.哈夫曼编码是定长编码

B.哈夫曼编码中,没有任何一个字符的编码是另一个字符编码的前缀

C.哈夫曼编码一定唯一

D.哈夫曼编码不能用于数据压缩

【参考答案】B

【考纲知识点】数据结构(哈夫曼编码的性质)

【解析】

哈夫曼编码是一种变长前缀编码,任一字符的编码都不是另一字符编码的前缀,因此解码时不会产生歧义。编码结果不唯一(合并顺序可调),但均为最优前缀码。

10、以下函数实现了二叉排序树(BST)的( )操作。

A.查找

B.插入

C.删除

D.遍历

【参考答案】B

【考纲知识点】数据结构(二叉排序树的插入操作)

【解析】

函数在二叉排序树中查找插入位置,若当前节点为空则创建新节点并返回,否则根据值大小递归插入左子树或右子树,最终返回根节点,符合插入操作的逻辑。

11、下列代码实现了树的深度优先遍历,则横线处应填入( )。

A.

B.

C.

D.

【参考答案】A

【考纲知识点】数据结构(迭代式深搜实现与栈的使用)

【解析】

本题考查二叉树的迭代式深度优先遍历(DFS),为了实现遍历顺序是 根→左→右,想要左子树优先于右子树被处理,就必须让左子节点后入栈、右子节点先入栈。这样出栈顺序是左孩子先于右孩子,符合前序遍历。

12、给定一棵普通二叉树(节点值没有大小规律),下面代码判断是否存在值为x 的结点,则横线处应填入( )。

A.

B.

C.

D.

【参考答案】C

【考纲知识点】数据结构(BFS遍历的实现)

【解析】

BFS遍历二叉树时,应将当前节点的左孩子和右孩子(若存在)依次入队,以保证层序访问所有节点。注意,需要先判断孩子节点是否存在,再入队。

13、在二叉排序树(Binary Search Tree, BST)中,假设节点值互不相同。给定如下搜索函数,以下说法 一定正确的是( )。

A.最坏情况下,访问结点数是O(logn)

B.最坏情况下,访问结点数是O(n)

C.无论如何,访问结点数都不超过树高的一半

D.一定比在普通二叉树中搜索快

【参考答案】B

【考纲知识点】数据结构(BST查找的时间复杂度)

【解析】

BST 查找的平均时间复杂度为O(logn),但在最坏情况下(树退化为链表),时间复杂度为O(n)。因此选项B 正确。

14、0/1背包(每件物品最多选一次)问题通常可用一维动态规划求解,核心代码如下。遍历的方向无所谓,则下面说法正确的是( )。

A.内层 j必须从小到大,否则会漏解

B.内层 j必须从大到小,否则同一件物品会被用多次

C.j 从大到小或从小到大都一样

D.只要 dp初始为 0,方向无所谓

【参考答案】B

【考纲知识点】动态规划(0/1背包的状态转移与遍历顺序)

【解析】

0/1 背包中,物品只能选一次。若j 从小到大遍历,则dp[j-w] 可能已经包含当前物品,导致物品被重复使用,相当于完全背包。因此必须从大到小遍历。

15、以下关于动态规划的说法中,错误的是( )。

A.动态规划方法通常能够列出递推公式。

B.动态规划方法的时间复杂度通常为状态的个数。

C.动态规划方法有递推和递归两种实现形式。

D.在使用动态规划思想(即避免重复子问题)的前提下,递推实现与递归实现(记忆化搜索)的时间复杂度通常是相当的。

【参考答案】B

【考纲知识点】动态规划(基本概念与复杂度分析)

【解析】

动态规划的时间复杂度不仅与状态个数有关,还与状态转移的复杂度有关。例如,状态数为O(n),每个状态转移需要O(m)时间,则总复杂度为O(nm),不一定等于状态个数。

二、判断题(每题2分,共20分)

题号

1

2

3

4

5

6

7

8

9

10

答案

×

√

√

×

√

×

√

×

×

√

1、以下代码中,构造函数被调用的次数是1次。

【答案】错误【考纲知识点】面向对象编程(构造函数的调用时机)【详细解析】在Python中,__new__:构造方法(创建对象),__init__:初始化方法(初始化对象);代码中__new__调用2次(创建a和b),__init__调用1次。这里构造方法(__new__)被调用了两次。因此,该说法错误。

2、面向对象编程中,封装是指将数据和操作数据的方法绑定在一起,并对外隐藏实现细节。

【答案】正确【考纲知识点】面向对象编程(封装的定义)【详细解析】

封装是面向对象三大特性之一,指将数据(属性)和操作数据的方法(函数)封装在类中,通过访问控制(public、private、protected)隐藏内部实现。

3、以下代码能够正确统计二叉树中叶子结点的数量。

【答案】正确

【考纲知识点】数据结构(二叉树的叶子节点统计)

【详细解析】

函数递归判断:若节点为空返回0;若节点左右孩子均为空则为叶子节点返回1;否则递归统计左右子树的叶子节点数。

4、广度优先遍历二叉树可用栈来实现。

【答案】错误

【考纲知识点】数据结构(BFS与栈/队列的选择)

【详细解析】

BFS使用队列实现(先进先出),以保证按层遍历;DFS才使用栈(先进后出)实现深度优先。因此该说法错误。

5、函数调用管理可用栈来管理。

【答案】正确

【考纲知识点】计算机系统基础(函数调用栈)

【详细解析】

函数调用栈(call stack)用于存储函数调用信息(返回地址、局部变量等),支持函数调用与返回的“后进先出”顺序。

6、在二叉排序树(BST)中,若某结点的左子树为空,则该结点一定是整棵树中的最小值结点。

【答案】错误

【考纲知识点】数据结构(BST的性质)

【详细解析】

若某节点左子树为空,不一定是整棵树的最小值。整棵树的最小值应从根节点一直向左遍历至叶子节点。

7、下面的函数能正确判断一棵树是不是二叉排序树(左边的数字要比当前数字小,右边的数字要比当前数字大)。

【答案】正确

【考纲知识点】数据结构(BST的递归判断方法)

【详细解析】

函数通过传入当前节点值的上下界(min_val, max_val)递归判断左右子树是否满足BST性质:左子树所有节点值应小于当前值,右子树所有节点值应大于当前值。

8、格雷编码相邻两个编码之间必须有多位不同,以避免数据传输错误。

【答案】错误

【考纲知识点】编码理论(格雷编码的特性)

【详细解析】

格雷编码的核心特性是相邻两个编码之间仅有一位不同,这有助于减少在数字电路或通信中因多位同时变化而产生的错误。

9、小杨在玩一个闯关游戏,从第1关走到第4关。每一关的体力消耗如下(下标表示关卡编号):cost = [ 0, 3, 5, 2, 4 ],其中cost[i]表示到达第i关需要消耗的体力,cost[0]=0表示在开始状态,体力消耗为0。小杨每次可以从当前关卡 前进 1步或2步。按照上述规则,从第1关到第4关所需消耗的最小体力为7。

【答案】错误

【考纲知识点】动态规划(最小路径消耗问题)

【详细解析】

设dp[i]表示到达第i关的最小体力消耗,则:

dp[1] = cost[1] = 3dp[2] = min(dp[1] + cost[2], cost[2]) = min(3+5, 5) = 5dp[3] = min(dp[2] + cost[3], dp[1] + cost[3]) = min(5+2, 3+2) = 5dp[4] = min(dp[3] + cost[4], dp[2] + cost[4]) = min(5+4, 5+4) = 9

因此最小体力为9,不是7。

10、假定只有一个根节点的树的深度为1,则一棵有n个节点的完全二叉树,则树的深度为。

【答案】正确

【考纲知识点】数据结构(完全二叉树的高度公式)

【详细解析】

完全二叉树的深度(高度)公式为:(根节点深度为1),该公式成立。

三、编程题(每题25分,共50分)

编程题1

试题名称:路径覆盖

时间限制:3.0 s

内存限制:512.0 MB

题目描述

给定一棵有n个结点的有根树 T,结点依次以1,2,...n编号,根结点编号为1。方便起见,编号为i的结点称为结点i。

初始时T中的结点均为白色。你需要将T中的若干个结点染为黑色,使得所有叶子到根的路径上至少有一个黑色结点。将结点i染为黑色需要代价ci,你需要在满足以上条件的情况下,最小化染色代价之和。

叶子是指T中没有子结点的结点。

输入格式

第一行,一个正整数n,表示结点数量。

第二行,n-1个正整数 f2,f3,...,fn其中fi表示结点i的父结点的编号,保证fi<i。

第三行,n个正整数c1,c2,...,cn其中ci表示将结点i染为黑色所需的代价。

输出格式

一行,一个整数,表示在满足所有叶子到根的路径上至少有一个黑色结点的前提下,染色代价之和的最小值。

样例

输入样例1

输出样例1

输入样例2

输出样例2

数据范围

对于40%的测试点,保证2≤n≤16。

对于另外20%的测试点,保证fi=i-1。

对于所有测试点,保证2≤n≤105,1≤ci≤109。

【题目大意】

给定一棵有根树,每个节点有染色代价。要求选择若干个节点染色,使得从每个叶子节点到根的路径上至少有一个被染色的节点。求最小染色代价和。

【考纲知识点】

树形动态规划、贪心策略

【解题思路】

1.问题转化:每个叶子到根的路径上至少有一个黑点,等价于所有叶子被某个祖先节点“覆盖”。

2.自底向上DP:从叶子节点向上递推,每个节点有两种状态:

·染当前节点:代价为 c[i],所有子树均被覆盖。

·不染当前节点:则每个子树必须自己提供覆盖(即子树根或子树内某节点被染)。

3.状态定义:dp[u]表示以u为根的子树满足条件的最小代价。

4.状态转移:

·若u 是叶子:必须染,dp[u] = c[u]

·否则:dp[u] = min(c[u], sum(dp[v])),其中v 是u 的子节点

5.参考程序

编程题2

试题名称:道具商店

时间限制:30.0 s

内存限制:512.0 MB

题目描述

道具商店里有n件道具可供挑选。第i件道具可为玩家提升ai点攻击力,需要ci枚金币才能购买,每件道具只能购买一次。现在你有k枚金币,请问你最多可以提升多少点攻击力?

输入格式

第一行,两个正整数n,k,表示道具数量以及你所拥有的金币数量。

接下来n行,每行两个正整数ai,ci,表示道具所提升的攻击力点数,以及购买所需的金币数量。

输出格式

输出一行,一个整数,表示最多可以提升的攻击力点数。

样例

输入样例1

输出样例1

输入样例2

输出样例2

数据范围

对于60%的测试点,保证1≤k≤500,1≤ci≤500。

对于所有测试点,保证1≤n≤500,1≤k≤109,1≤ai≤500,1≤ci≤109。

【题目大意】

有 n件道具,每件道具有攻击力a[i] 和价格c[i],只能购买一次。现有金币k,求能获得的最大攻击力。

【考纲知识点】

动态规划(0/1背包变形)

【解题思路】

1.问题转化:典型0/1 背包问题,但价格和金币值可能很大(k和 c[i]可达 1e9),直接按价格做DP 会超时。

2.转换维度:由于a[i] ≤ 500,总攻击力上限为500 * 500 = 250000,可改为以攻击力为维度进行DP。

3.状态定义:dp[j]表示获得恰好 j点攻击力所需的最小金币数。

4.状态转移:

  • for i in 物品:    for j = totalA down to a[i]:        dp[j] = min(dp[j], dp[j - a[i]] + c[i])

5.参考程序

策划:GESP技术委员会副主席 刘晓庆

技术支持:马强

GESP第13次认证报名最后一天

GESP2026年3月认证报名最后一天,报名将于3月5日24点截止;点击登录CCF GESP网站(https://gesp.ccf.org.cn/)进行报名,欢迎学有余力的同学参加认证!

联系方式

1.GESP微信:关注“CCF GESP”公众号,点击"GESP小助手"即可交流。

2.GESP邮箱:gesp@ccf.org.cn

注:请在邮件中详细描述咨询的问题并留下考生的联系方式及姓名、身份证号,以便及时有效处理。

3.GESP电话:0512-67656856

咨询时间:周一至周五(法定节假日除外): 上午 8:30-12:00;下午 13:00-17:30

扫描下方二维码,关注GESP公众号了解更多资讯

最新文章

随机文章