12月的CCF GESP认证刚落下帷幕,Python 1级依然是报考人数最多的科目之一。这几天陆续有学生和家长来问我真题的情况,尤其是“2025年12月认证”的题目到底考了什么、难度怎么样、哪些地方容易丢分。我花了两天时间把手上能接触到的考生回忆题、考点反馈和官方考纲重新过了一遍,把Python 1级这套卷子从头到尾拆解了一遍,写成这篇带答案、带解析、带避坑指南的真题复盘。
无论你是准备明年6月那一场的新考生,还是已经在刷题的家长,这篇文章都值得认真看一遍。先说清楚文章解决什么问题:帮你快速判断自己的Python 1级水平在哪个位置,搞懂考试最核心的考点到底是什么,以及正式上考场时最容易在哪些不起眼的小细节上翻车。本文会从考试全貌、题型分值、真题逐题解析、编程题完整复现代码、高频失分点、备考路线图六个方面展开,尽量做到“看完这一篇,等于做了一整套模拟题加一次考前串讲”。
1. CCF GESP考试全貌:Python 1级到底考什么
1.1 GESP认证的基本认知
GESP是CCF(中国计算机学会)主办的青少年编程能力等级认证,全称是Grade Examination of Software Programming。在中国的编程类等级考试里,它的认可度排在比较靠前的位置。和很多机构自己搞的评测不同,GESP由CCF统一命题、统一阅卷、统一颁发证书,出题规范性和评分严谨性都要高一个档次。
GESP一共划分为八个级别,从一级到八级,难度逐级递增。1级是入门级,主要面向零基础或者刚学了几个月Python的考生。它的定位不是“选拔编程天才”,而是检验考生是否掌握了Python语言最基础的核心语法,能不能看懂简单的程序,能不能独立写出解决简单问题的代码。这一点很关键,很多考生和家长对1级的预期是错误的——以为会考什么复杂的算法,结果一看到考纲发现全是基础语法,反而掉以轻心,最后在一些细节上丢分。
1.2 Python 1级官方考纲范围速览
如果你还没系统看过考纲,下面这个清单是你第一件要做的事。Python 1级的考点范围非常明确,基本可以归纳为下面几类:
- 变量与基本数据类型:int、float、str、bool的定义和使用,变量命名规则
- 输入与输出:input()读入、print()输出、字符串和数字的拼接方式
- 运算符:算术运算符(+、-、*、/、//、%、**)、比较运算符(>、<、==、!=、>=、<=)、逻辑运算符(and、or、not)
- 数据类型转换:int()、float()、str(),以及type()查看类型
- 字符串基础操作:索引、切片,常用的len()、upper()、lower()等方法
- 列表基础:创建列表、按下标访问元素、append()方法、len()函数
- 流程控制:if/elif/else分支语句,for循环、while循环,break和continue的简单使用
- 简单算法思想:累加器、计数器、求最大值最小值、枚举法(穷举法)
- 基础库函数:random库的random.randint(),math库的常用数学函数
这个范围在2025年12月的考试中体现得非常明显,几乎每道题都能在考纲里找到对应的位置。换句话说,这套卷子出得非常“规矩”,没有超纲题,也没有偏题怪题。前提是你真的把上面这些知识点吃透了。
1.3 2025年12月这场考试的整体特点
从考生反馈和我自己看到的题目信息来看,这次考试有三个明显特点。
第一,选择题对“易混淆概念”的考查力度加大了。比如整除和取余、整数除法和浮点数除法、range函数的边界值、字符串切片的左闭右开规则,这类题目反复出现,说明命题组有意在引导考生关注这些平时写代码容易忽略的细节。
第二,编程题的难度没有拔高,但题目描述更“生活化”。两道编程题都不是直接说“求1到100的所有奇数和”这种干巴巴的题面,而是套了一个场景,比如统计某个月份的天数、把数字倒序输出、计算某种比赛得分。考生首先要能从场景中提取出数学模型,再转化成代码。这一步其实比写代码本身更能拉开差距。
第三,代码填空和读程序写结果的题目占比不低。这类题考的是“能不能读懂别人写的代码”,很多考生自己写代码没问题,但一看到别人写的变量名不规范、逻辑绕一点的程序就懵了。这提醒我们平时练习时不要只盯着一路写到底,要习惯去阅读代码、手推代码的执行过程。
2. 真题题型与分值拆解:先搞懂游戏规则
2.1 考试形式与时间分配
CCF GESP Python 1级的考试时长为120分钟,满分100分。题型分为两大块:第一部分是客观题,包括单选题和判断题;第二部分是编程题,一般是两到三道。
从近几年尤其是2025年的情况看,客观题部分的分值比重和编程题基本上各占一半左右。客观题考查的是知识点的覆盖面和精确记忆,编程题考查的是综合运用能力。你可以这样理解:客观题是“扫雷”,把你在语法细节上的每一个漏洞都翻出来;编程题是“盖房子”,看你能不能把学过的一块块语法知识拼成能运行的程序。
时间分配上,我的建议是:客观题控制在40到50分钟以内,剩下的时间全部留给编程题。很多考生喜欢在选择题上反复纠结,一道题琢磨十分钟,最后编程题只够写半道,这是最亏的。
2.2 核心考点分布权重表
根据这次考试的题目反馈,我把高频考点和对应的分值权重整理成了表格,方便你直观看到复习重点在哪里。
| 考点模块 | 具体知识点举例 | 本次考试出现频次 | 复习优先级 |
|---|---|---|---|
| 输入输出 | input、print、格式化输出 | 高 | 必须掌握 |
| 变量与类型 | 类型转换、type()、变量名规则 | 高 | 必须掌握 |
| 算术运算符 | //、%、/、**的区别 | 高 | 必须掌握 |
| 流程控制 | if、elif、for、while | 最高 | 必须掌握 |
| 字符串操作 | 索引、切片、len() | 中高 | 重点掌握 |
| 列表基础 | 索引、append、len() | 中 | 重点掌握 |
| 逻辑运算符 | and、or、not的优先级 | 中 | 重点掌握 |
| 函数库调用 | random、math常用函数 | 低 | 理解会用 |
从这个表能看出一个趋势:语法基础是绝对的核心。这次考试几乎没有出现任何“偏难怪”的知识点,所有题目都建立在最基本的语法之上。换句话说,如果你把基础语法磨得足够扎实,卷面上的大部分分数已经稳了。
2.3 和往年考试相比的变化趋势
对比前两年的题目,2025年12月的卷子有一个明显变化:读程序题的比例在上升。所谓读程序题,就是给你一段已经写好的代码,问你输出结果是什么,或者某个变量的值最后变成了什么。这种题不考你背概念,考的是你能不能“模拟计算机执行程序”。很多考生平时用IDE写代码,写完一运行就有结果,根本不习惯在脑子里逐行推演代码的执行流程。结果一到考场,不能用电脑,只能靠草稿纸手推,一下子就慌了。
这也是我写这篇解析文章时特别想强调的一点:GESP一级虽然难度不高,但正在从“考你会不会写”向“考你会不会写、会不会读、会不会查错”三个能力维度转变。备考时一定要有意识地训练脱离IDE的“裸推”能力。
3. 2025年12月Python 1级选择题真题解析
3.1 第1题:运算符优先级与逻辑判断
题目(考生回忆版):执行以下代码后,输出结果是什么?
print(2 + 3 * 2 == 8 and 10 // 3 == 3)这道题同时考了两个点:算术运算符的优先级和逻辑运算符的执行方式。
先算算术部分。3 * 2先执行,结果是6,所以2 + 3 * 2等于2 + 6,结果是8;8 == 8两个数字相等,比较结果为True。接着看后半部分:10 // 3在Python里是整除运算,10除以3的商是3(不保留小数部分),所以10 // 3 == 3也为True。最后两个True用and连接,结果为True。
正确答案是True。
这道题想提醒你的是:==是比较运算,返回的是布尔值,而//是整除运算。/、//、%这三个运算的区别,在一级考试里属于“必考必错”的频率极高的考点,后面还会再遇到。
3.2 第2题:int()类型转换的截断规则
题目(考生回忆版):以下哪个表达式的结果不是整数?
A.int(3.8)
B.round(3.8)
C.3 // 2
D.3.0 + 2
这道A、B、C、D四个选项分别考了不同的知识。
先看A选项,int(3.8)。这里有一个经典误区:int()不是四舍五入,而是直接截断小数部分,向零取整。所以int(3.8)的结果是3,是整数。
再看B选项,round(3.8)。round()才是四舍五入函数,3.8四舍五入后是4,所以结果也是整数。
然后是C选项,3 // 2。整除运算符结果取商,3除以2的整数商是1,结果是整数。
最后是D选项,3.0 + 2。这里涉及Python的类型转换规则:当整数和浮点数做算数运算时,Python会把结果自动提升为浮点数。3.0是浮点数,2是整数,两者相加结果是5.0。注意,5.0在Python里是浮点数类型,虽然在数学意义上它“等于”整数5,但它的数据类型是float。所以D选项的输出结果不是整数。
正确答案是D。
这道题的深层坑点在于:很多考生看到3.0 + 2结果等于5,就理所当然认为它“是整数”。实际上判断一个表达式的类型,要看它在Python里真正的数据类型。这个小细节在选择题里反复出现,属于典型的“看起来简单、错起来扎心”。
3.3 第3题:字符串切片边界
题目(考生回忆版):执行以下代码,输出结果是?
s = "Python" print(s[1:4])字符串切片是Python一级考试里一个“老师讲了无数遍还是会有人错”的知识点。
s[1:4]表示从索引1开始取,取到索引4的前一个位置,也就是左闭右开区间[1, 4)。字符串"Python"的索引分布如下:s[0]='P',s[1]='y',s[2]='t',s[3]='h',s[4]='o',s[5]='n'。
所以s[1:4]取的是索引1、2、3对应的字符,即'y'、't'、'h',合在一起就是"yth"。
正确答案是yth。
这里最容易出的问题是两个:一是把起始索引当成1,二是不理解切片“含头不含尾”的规则,把s[1:4]的结果误写成"ytho"。建议你记一个口诀:切片区间左闭右开,从哪个索引开始写哪个,到哪个索引前一位结束就写哪个。
3.4 第4题:range函数的三种参数形式
题目(考生回忆版):执行list(range(1, 10, 3))得到的结果是?
A.[1, 4, 7, 10]
B.[1, 4, 7]
C.[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
D.[1, 3, 5, 7, 9]
range(1, 10, 3)的三个参数分别是起始值、结束值、步长。它的取值规则是:从起始值开始,每次加步长,只要还小于结束值就继续取,等于或大于结束值就停止。在这个例子中,起始值是1,加三次步长得到4、7,再加一次步长得到10,10已经不满足“小于结束值10”的条件,所以不包含10。
因此最终结果是[1, 4, 7]。
正确答案是B。
关于range函数,一级考试里最常设置的陷阱有两个:一是忽略结束值“取不到”,二是步长为负数时容易搞混起点和终点。建议你在草稿纸上画一条数轴,把每个数字都写出来,这种题就不会错。
3.5 第5题:列表append方法与列表值的输出
题目(考生回忆版):执行以下代码后,输出的结果是?
lst = [3, 1, 2] lst.append(4) lst[1] = 0 print(lst)这道题结合了列表的两个基本操作:append()方法和按下标修改元素。
先看lst = [3, 1, 2],这是一个包含三个元素的列表。lst.append(4)把4添加到列表末尾,列表变成[3, 1, 2, 4]。注意,append是在原列表上直接修改,而不是生成一个新列表,这个“原地修改”的特性经常在判断题里出现。然后是lst[1] = 0,把索引为1的元素从1改成0。列表最终变成[3, 0, 2, 4]。
正确答案是[3, 0, 2, 4]。
这道题中,最容易出错的是混淆lst[1]与lst[-1]。lst[1]是第二个元素,lst[-1]才是最后一个元素。负数索引在Python里是很方便的特性,但也是一级考试中考生容易脱口而出错误答案的重灾区。
3.6 第6题:while循环与累加器
题目(考生回忆版):以下程序执行后,变量total的值是多少?
total = 0 i = 1 while i <= 5: total = total + i i = i + 1 print(total)这是最典型的累加器模型。用表格来推演的话:
| 循环轮次 | i的值(循环开始前) | total更新后 | i更新后 |
|---|---|---|---|
| 第1轮 | 1 | 0+1=1 | 2 |
| 第2轮 | 2 | 1+2=3 | 3 |
| 第3轮 | 3 | 3+3=6 | 4 |
| 第4轮 | 4 | 6+4=10 | 5 |
| 第5轮 | 5 | 10+5=15 | 6 |
| 第6轮 | 6 | 循环条件6<=5不成立,循环结束 | — |
所以total最后的值是15。
这道题的考点有两个:一是while循环的执行条件,二是累加器必须放在循环体内部,而判断条件中的i <= 5用的是小于等于,不是小于。如果把条件写成i < 5,结果就会变成10,这是命题人最喜欢挖的坑。
4. 编程题真题还原与完整实现
4.1 编程题第一题:求指定范围内奇数之和
这道编程题在2025年12月的考试中以“某活动统计得分”的形式出现,去掉场景外壳后,核心要求是:输入一个正整数n,计算1到n之间所有奇数的和并输出。
输入样例:
5输出样例:
9解释:1到5之间的奇数有1、3、5,和为9。
参考代码如下:
n = int(input()) total = 0 for i in range(1, n + 1): if i % 2 == 1: total += i print(total)逐行解析一下。input()读入的是一个字符串,比如输入5,读进来的是"5",必须用int()转换成整数才能参与算术运算。range(1, n + 1)生成从1到n的整数序列,这里为什么要写成n + 1?因为range区间是左闭右开,不包含结束值,想要让n本身被遍历到,就必须把结束值设为n + 1。i % 2 == 1是判断奇数的方法,如果i除以2的余数是1,说明它是奇数。total += i是累加的简写形式,等价于total = total + i。
这道题还有一个更Pythonic的写法:
n = int(input()) print(sum(range(1, n + 1, 2)))range(1, n + 1, 2)直接从1开始隔一个取一个,生成1、3、5……直到不超过n的最后一个奇数,再用sum()求和。不过对于一级考试,我更推荐第一种写法,因为for循环加条件判断更贴近考纲的考点范围,阅卷时也更容易让评分老师看清你的思路。第二种拿来了解即可。
4.2 编程题第二题:数字反转
第二道编程题是一个“数字反转”类题目。题目要求:输入一个三位正整数,把它的百位、十位、个位倒过来组成新的数输出。例如输入123,输出321。如果输入120,输出21(因为反转后是021,前面的0不输出)。
参考代码如下:
n = int(input()) a = n // 100 # 百位 b = n // 10 % 10 # 十位 c = n % 10 # 个位 result = c * 100 + b * 10 + a print(result)这道题的精髓在于拆分各个数位。通过整除和取余的组合,可以从一个整数里抽出任意一位:
- 百位:
n // 100,比如123 // 100结果是1,直接把百位以上的部分全砍掉,商就是百位。 - 十位:
n // 10 % 10,先把123变成12(整除10),再对10取余得到2,这一步是从“去掉个位后的数”里再取出最低位。 - 个位:
n % 10,任何整数对10取余,结果就是个位数。
拆出三个数位后,重新组合:原来的个位变成新数的百位,所以要乘以100;原来的十位变成新数的十位,乘以10;原来的百位变成新数的个位,乘以1。如果原来的个位是0,比如输入120,则c = 0,结果的百位是0,输出时Python会自动把0省略,打印21,正好符合“前导零不输出”的要求。
这道题也完全可以用字符串来解决:
s = input() print(int(s[::-1]))利用字符串切片逆序,再用int()转换去掉开头的0。但在考场上,我更推荐用整数运算的写法,因为它在后续二级、三级学习数位处理时是通用基础,而且不太容易出现因字符串切片边界搞错而丢分的情况。
4.3 编程题第三题:月份天数判断
这次的第三道编程题(也有考场将其列为附加题)是一道条件分支题:输入一个整数m,代表月份,输出这个月有多少天。其中2月按28天计算。
输入样例:
4输出样例:
30参考代码如下:
m = int(input()) if m == 2: print(28) elif m in [4, 6, 9, 11]: print(30) else: print(31)这道题考察的是并列条件分支结构的应用。大月1、3、5、7、8、10、12月有31天,小月4、6、9、11月有30天,2月特殊为28天。
这里有两个关键细节:第一,判断月份归类时,用成员运算符in加上列表,比一连串or要简洁得多,也不容易漏写月份。第二,elif的顺序很重要,必须把2月这种特殊月份放在最前面优先判断。实际上三个分支的顺序不影响正确性,但把最容易特殊的情况放在最前面,阅读代码的人可以最快抓住重点,这也是评判代码质量时的一个参考维度。
5. 高频失分点与考场避坑指南
5.1 客观题里反复出现的“同款陷阱”
根据历年真题和2025年12月这次考试的反馈,Python 1级里有一批“高频送命题”,基本上每场考试都会换着法儿出现。我整理成了一张速查表,你可以对照着自查。
| 陷阱场景 | 错误理解 | 正确答案 | 易错指数 |
|---|---|---|---|
10 / 3和10 // 3 | 都当作除法 | 前者结果是3.333...(浮点数),后者结果是3(整数) | 高 |
int(3.9) | 四舍五入为4 | 直接截断小数部分为3 | 高 |
range(1, 5)包含哪些数 | 1到5都包含 | 包含1、2、3、4,不包含5 | 最高 |
s[0:3]的取值 | 索引0到3共4个字符 | 是索引0、1、2共3个字符 | 高 |
input()的返回类型 | 认为是数字 | 一定是字符串,要用int()转换 | 最高 |
a == b和a = b | 两者都表示等于 | ==是比较,=是赋值 | 高 |
print(a, b)和print(a + b) | 输出结果相同 | 前者中间有空格,后者是拼接后的值 | 中 |
这张表建议你在考前最后一天再看一遍。客观题丢分往往不是因为你不会,而是因为你在这些“约定俗成的规则”上踩了坑。
5.2 编程题里最致命的三个低级错误
第一个是忘记类型转换。很多考生写n = input(),紧接着就写for i in range(n),然后运行报错,在考场上一紧张更看不出问题在哪。记住一个原则:input()进来的永远是字符串,需要参与数学运算时,第一时间就要int()或float()。
第二个是循环边界不对。for i in range(1, 5)到底能不能取到5?答案是取不到。编程题里的累加、统计类题目,几乎全都要靠range,边界错了就全错了。我的建议是:不确定边界时,把区间在草稿纸上写一遍,再在代码里用print(list(range(...)))这样的方式验证一次。
第三个是=和==混用。在判断条件里写if i = 5,这在Python里会直接报语法错误;在循环条件里写while i = 1,则会变成无限循环。考场上如果遇到程序死循环,第一个要排查的就是赋值符号是否写错了。
5.3 考场上时间不够用了怎么办
如果你在考场上发现剩余时间只剩30分钟,但编程题还有一道没写,请按下面这个优先级处理:先放弃完美主义,用最笨的办法把题写出来。所谓最笨的办法,就是不用考虑代码的简洁性、不要追求“一行代码搞定”,老老实实地用循环、分支、累加器,一步一步把逻辑写清楚。GESP的评分按测试点给分,你的代码只要能通过一部分测试点,就能拿到对应的部分分数。一个能运行的、思路清晰的笨代码,远比一个写了一半的高深解法得分高。
5.4 检查环节的“30秒快速自查法”
做完题还剩时间的话,不要干坐着。用30秒快速检查这几项:程序里每个input()是不是都用了int()或float()转换、每个range边界是否合理、输出格式和题目样例是否一致(尤其是有没有多空格、缺换行)。编程题的输出格式是最容易被忽略的得分点,很多考生逻辑全对,就是多打了一个空格或者少写了一个print(),直接被扣掉测试点分数。
6. 备考路线图:从真题复盘到下次考试
6.1 考前四周的复习节奏安排
如果你打算参加接下来6月的GESP Python 1级考试,可以参考我给学生制定的四周复习计划,节奏比较稳妥。
第一周打基础:重新过一遍考纲里的所有基础语法,每个知识点配合10到20道专项小题练习。这一周的目标不是刷难题,而是把所有容易混淆的概念掰开揉碎,比如整除和取余、切片边界、range闭开区间。
第二周刷真题:把近两年的GESP Python 1级真题完整做一遍。做题时不要边看答案边做,要定时90分钟全真模拟。做完以后不看分数,先看错题,把每道错题的知识点定位到考纲的具体条目上。
第三周专项强化:针对第二周暴露出来的薄弱环节,集中刷同一知识点的不同变体题。比如切片老错,就刷20道切片题;while循环边界老错,就刷20道循环题。错了不可怕,但错完之后要总结出同一类题的通用解法,形成自己的答题模板。
第四周冲刺与模拟:每两天做一套全真模拟题,严格按照120分钟掐表。最后两天不再做新题,只翻错题本和本文第5部分的避坑清单。
6.2 平时练习时最值得坚持的两个好习惯
第一个习惯是手推代码。找几道历年真题或练习题,先在纸上把代码的执行过程和输出结果推演一遍,再上机运行验证。这个过程模拟的是考场上的真实场景,因为正式考试时你面对一道读程序题,是没有IDE可以帮你运行的。平时训练得越多,考场上的“脑内编译器”就越准。
第二个习惯是为每道错题写一句话的错因总结。不要只写“我粗心了”,要具体到根因,比如“range起始值多写了一个1”“忘记input()返回的是字符串”。考试前翻一遍错因总结,比重新做十套模拟卷都管用。
6.3 GESP 1级之后怎么规划后续进阶
GESP 1级只是起点,通过后紧接着就是2级。2级在1级的基础上增加了函数、嵌套循环、字典等新考点,难度会有一个明显的跳跃。如果你想无缝衔接,1级考完后不要立刻松懈,趁热打铁把函数部分学起来,尤其是自定义函数的定义与调用、参数与返回值,这两个知识点是2级的核心。
从更长远的角度看,GESP的八级证书和CSP-J/S认证之间存在衔接关系,很多走信息学竞赛路线的学生都会把GESP作为前期的梯度训练。但这条路需要时间和兴趣做支撑,不必急于求成。先把眼前的1级拿下,再根据自己实际的学习节奏决定下一步,这个节奏是最健康的。
我在实际备考中还有一个特别想强调的体会:GESP一级看似简单,但它检验的不只是会不会写代码,更是你有没有养成严谨的思维习惯。很多失分点,本质上都是“差不多”心态造成的——觉得print(17 / 3)和print(17 // 3)差不多,觉得索引从1开始从0开始差不多,觉得range(1, 5)包含5不包含5差不多。只有把这些“差不多”变成“差一点都不行”,这门考试才算是真正帮你打好了编程的基础。刷题时也请在弄懂每道题的同时,顺手把题里涉及的语法在编辑器里多敲两遍,你会发现,看十遍解析的印象远不如亲手运行一遍代码来得深刻。