☰
计算机二级Python备考:40分选择题+60分操作题的得分策略
2026/10/26 3:04:37 网站建设 项目流程

简介:面向准备全国计算机等级考试二级Python科目的考生整理的题库型复习材料,适合零基础入门后的专项刷题、考前查漏补缺与教师课堂练习选用。压缩包共205个文件、约831KB,以129个Python源码和50个文本答案为主,辅以截图、说明文档及少量数据文件,覆盖选择题、程序填空、编程题等常见题型的练习与核对场景,便于按知识点分块训练并对照参考答案复盘。相关资源已有4478人学习,说明其在备考群体中具备一定参考价值。读者可从中获得成套题目与答案、可直接运行的示例脚本、刷题经验总结以及部分题解截图,用于理解语法考点、验证输出结果和整理错题思路;目录组织相对紧凑,也方便按模块检索,适合需要集中练习二级Python真题风格题目的备考者。

1. 从一道「看着会做」的题说起:二级 Python 到底考什么

很多人第一次做二级 Python 的模拟卷都会犯嘀咕:语法我明明学过,分数怎么就是上不去。答案藏在题型结构里——100 分的卷子,40 分是选择题(公共基础约 10 分、Python 语法约 30 分),剩下 60 分全是上机操作:基本操作 15 分、简单应用 25 分、综合应用 20 分。及格线 60 分,操作题拿七成、选择题不崩,证基本就稳;反过来,选择题靠蒙、操作题留白,怎么算都不够。所以它考的不是「你学没学过 Python」,而是「你能不能在机器上把代码写对、跑通,输出和判分程序对得上」。这场考试最适合两类人:要拿证的非计算机专业学生,和语法看过一遍、一上机就卡壳的自学者。

2. 分值地图:40 分选择题 + 60 分操作题,先抢哪一块

备考最怕的是平均用力:把 100 分当成 100 个知识点,从第一页看到最后一页。分值摊开之后,取舍其实很清楚——选择题决定你会不会,操作题决定你过不过。上机时间 120 分钟,绝大多数人不是不会写,而是把时间浪费在反复改一个本来就对的输出格式上。

2.1 选择题 40 分:公共基础 10 分 + Python 语法 30 分

公共基础那 10 分,考的是四块内容:数据结构与算法(线性表、栈、队列、树与二叉树、查找与排序)、程序设计基础、软件工程基础、数据库基础。典型问法非常固定:给一棵二叉树的前序和中序,求后序;判断冒泡、选择、堆排序哪个是稳定的;比较几种排序在最坏情况下的时间复杂度;E-R 图转关系模式。这一块的特点是「背了就有、没背全靠蒙」,是整个考试里投入产出比最高的部分,每天二十分钟背结论,两周足够。

Python 语法那 30 分,一半是「读代码写输出」,一半是概念辨析。读代码的题不需要你懂业务,只要在草稿纸上按行演算;概念辨析考的是「哪个是不可变类型」「哪个不是保留字」「哪个语句的缩进不合法」。很多考生栽在前者上,是因为想靠眼睛「看出来」,而不是老老实实把变量值一步一步写下来。下表是各模块的大致占分,用来决定先复习谁。

模块大致占分典型问法复习方式
公共基础10二叉树遍历、排序稳定性、E-R 图背结论 + 刷选择题
数据类型与运算6~8读代码写输出、类型判断手算,不靠猜
程序控制结构5~7循环执行次数、break/continue画执行轨迹
函数与作用域5~7参数传递、global、递归记规则
组合数据类型6~8切片、字典方法、集合运算背方法表
文件与异常3~5open 模式、try 结构记模式字符
计算生态2~4random、turtle、jieba 常见函数认函数名和作用

提示:计算生态那几分最容易「看眼熟就选错」,把 random 的 randint/random/choice/shuffle 四个函数和 jieba 的 lcut 记牢,基本够用。

2.2 操作题 60 分:三种题型的判分逻辑

基本操作 15 分,通常是 3 个小题、每题 5 分。题目给一段挖空的代码,用注释标出第 (1)(2)(3) 空,考的是单个语法点:补一个列表推导、补一个 range、补一个字符串格式化、补一个字典遍历。这类题不需要设计能力,考的是「认得出这里缺什么」,属于送分区。

简单应用 25 分,通常 2 个小题。给的是半成品程序:文件已经读好了、输出也已经写好了,让你补全中间那段统计逻辑。考的是「把一句中文需求翻译成一层循环加一个判断」的能力,是这个考试真正的分水岭。

综合应用 20 分,1 道大题。从读取文件、解析每行、汇总统计、排序到写成结果,一条龙全是自己写。分数差最大,也是最多人直接空着交卷的题。

判分方式是机器判分:系统运行你的程序,比对标准输出(打印在屏幕上的内容)或者指定的结果文件。它不看你的变量名起得好不好,也不看注释写得漂不漂亮,但空格、换行、大小写、中英文标点全部算数。所以一个多余的空格,足以让 5 分变成 0 分。

题型分值题量考什么最常见丢分点
基本操作153 小题单点语法填空缩进、符号、空格数量
简单应用252 小题需求转循环边界条件、遍历方向
综合应用201 题完整数据处理流程文件编码、输出格式

2.3 真题演练:四道典型选择题的拆解

第一道,切片与引用的区别。这道题几乎每年换个变量名再来一次。

a = [1, 2, 3, 4, 5] b = a[1:4] # 切片:生成一个新列表,元素是原列表的浅拷贝 b[0] = 100 # 改的是 b,a 不受影响 print(a, b)

答案输出是[1, 2, 3, 4, 5] [100, 3, 4]。参数上,a[1:4]取的是下标 1、2、3 三个元素,左闭右开,4 取不到。判断依据就一句话:切片产生新对象,赋值只是加了个名字。如果把第二行换成b = a,那就成了别名,改 b 等于改 a,输出会变成两个[100, 2, 3, 4, 5]。很多人失分是因为脑子里默认「列表赋值就是复制」。

第二道,可变默认参数。

def add(x, lst=[]): # 默认参数在函数定义那一刻就求值,只创建一次 lst.append(x) return lst print(add(1)) print(add(2))

两次输出分别是[1]和[1, 2]。原因在于[]这个默认值属于函数对象本身,两次调用共用同一个列表。正确写法是def add(x, lst=None):再在函数体里判断if lst is None: lst = []。考场上见到「默认值是列表或字典」的题,先在心里拉一根线。

第三道,字典计数。

s = "abracadabra" d = {} for ch in s: d[ch] = d.get(ch, 0) + 1 # get 取不到时返回 0,不会抛 KeyError print(len(d), d["a"])

输出5 5。len(d)统计的是不同字符的个数,不是字符串长度。get的第二个参数是「键不存在时的返回值」,这一步是二级考试里出现频率最高的写法之一,统计词频、统计成绩分布都会用到。如果换成d[ch] += 1,第一次遇到新字符就会抛KeyError。

第四道,公共基础里的二叉树遍历。已知前序序列为 ABDECF、中序序列为 DBEAFC,求后序序列。做法是先从前序的第一个元素确定根 A,再到中序里把序列切成左子树 DB E 和右子树 F C;左子树里前序是 BDE、根是 B,继续切出 D 和 E;右子树里前序是 CF、根是 C,切出左 F、右空。最后按「左、右、根」拼回去,答案是 DEBFCA。这类题没有捷径,拿笔画树,画完再写答案,比在脑子里空转快得多。

3. 高频考点:五个必考模块与它们的标准答法

操作题看似千变万化,拆到底层其实只有五类动作:拿数据、控流程、封装函数、读写文件、按要求输出。把这五类练到不用想,60 分里拿到 45 分以上并不难。

3.1 组合数据类型:列表、元组、字典、集合

这四个容器是操作题的地基。列表可变、有序、可重复;元组不可变,常用来做函数的多个返回值;字典按键取值,适合统计和映射;集合自动去重,适合求交集并集。二级考试最常见的组合是「用字典计数、用 sorted 排序、用列表切片取前几名」。

容器写法有序可变去重高频操作
列表 list[1,2]是是否append、切片、sort
元组 tuple(1,2)是否否解包、返回值
字典 dict{"a":1}是(3.7+)是键唯一get、items、keys
集合 set{1,2}否是是add、&、|、-
# 统计字符出现次数,按次数降序、字符升序取前三 text = "abracadabra" count = {} for ch in text: count[ch] = count.get(ch, 0) + 1 # 取不到时默认 0,再加 1 items = sorted(count.items(), key=lambda kv: (-kv[1], kv[0])) for ch, n in items[:3]: print(ch, n)

这段代码里有三个参数值得说清楚。count.items()返回的是(键, 值)组成的视图对象,可以直接进 sorted。key接收一个函数,排序时用它算出的结果作比较依据;lambda kv: (-kv[1], kv[0])返回一个二元组,先按次数取负实现降序,次数相同时再按字符升序,这样排序结果才是稳定的、可复现的。items[:3]是切片,取前三条。输出为a 5、b 2、r 2。如果只会写sorted(count.items(), key=lambda kv: kv[1]),遇到「次数相同按字符排序」的题目就会翻车。

3.2 程序控制结构:循环、分支与异常

控制结构考两件事:循环跑几次,异常按什么顺序走。for ... else和while ... else是二级考试偏爱的点——else 在循环正常结束(没有被 break 打断)时执行,很多人一辈子没写过,考到了就空着。range(a, b, step)三个参数的边界也是常客:range(1, 10, 2)得到 1、3、5、7、9,终止值取不到。

异常处理的顺序必须背下来:try 里没出错,跳过 except 直接进 else,最后不管出不出错都执行 finally;try 里出错,跳到匹配的 except,else 不执行,finally 照样执行。常见异常名也要认:ValueError(类型对但值不对,比如 int("abc"))、IndexError(下标越界)、KeyError(字典没这个键)、ZeroDivisionError、FileNotFoundError。

try: with open("score.txt", "r", encoding="utf-8") as f: lines = f.readlines() except FileNotFoundError: print("文件不存在") # 只有这一种异常会走到这里 else: print("共读取", len(lines), "行") # try 没抛异常才执行 finally: print("处理结束") # 无论如何都执行

open的三个参数分别是路径、模式、编码;encoding="utf-8"是最容易被漏掉、又最容易导致读出来是乱码或者直接报错的一个。with的作用是离开代码块自动关闭文件,省掉手动close(),在考场上能少一个出错点。

3.3 函数与参数:默认值、可变参数、作用域

函数题的核心是「参数怎么传进去、结果怎么传出来」。位置参数按顺序对,关键字参数按名字对,默认参数可以省略,*args把多余的位置参数收成元组,**kwargs把多余的关键字参数收成字典。返回值写return a, b时,实际返回的是一个元组,接收时可以直接x, y = f()解包。

作用域按 LEGB 找:局部、外层函数、全局、内置。函数内部想改全局变量要写global,否则只是创建了一个同名局部变量,这是选择题的高频陷阱。

def stat(*nums, base=0): # *nums 收集位置参数为元组,base 是仅关键字参数 total = base for n in nums: total += n return total, round(total / len(nums), 2) if nums else 0 # 返回元组 s, avg = stat(80, 90, 70, base=10) print(s, avg)

*nums前面的星号表示「把剩下的位置参数打包成一个元组」,所以传 80、90、70 进去,nums 就是(80, 90, 70)。base=10写在星号参数后面,只能通过关键字传,调用时必须写base=10。round(x, 2)保留两位小数,避免输出一长串浮点尾数被判错。输出是250 83.33。注意后面那个条件表达式if nums else 0,是为了防止空参数时除以零。

3.4 文件读写与格式化输出

文件题在综合应用里几乎必考,套路固定:打开、逐行读、切分、转换类型、累加、输出。模式字符要分清:r只读、w覆盖写、a追加写、r+读写;后面加b就是二进制模式,加了 b 就不能再指定 encoding。

逐行读有三种写法,readlines()一次读成列表,readline()一次读一行,for line in f直接迭代文件对象最省内存。切分用split(","),去空白用strip(),拼接用",".join(列表)。格式化输出优先记"{:.2f}".format(x)和 f-string 两种,前者在考场上更保险。

with open("scores.csv", "r", encoding="utf-8") as f: next(f) # 跳过第一行表头 total, cnt = 0, 0 for line in f: parts = line.strip().split(",") # 先去行尾换行,再按逗号切 total += int(parts[1]) # 第二列是分数,字符串要转 int cnt += 1 print("平均分:{:.2f}".format(total / cnt))

next(f)直接让文件指针跳过一行,比设一个标志变量干净。line.strip()不能省,否则最后一行读进来的"90\n"转 int 会抛 ValueError。parts[1]是下标取值,注意 CSV 的列从 0 开始数。{:.2f}里的.2表示保留两位小数,f表示浮点格式,这一串字符写错一个,输出就对不上标准答案。

3.5 真题演练:把上面四个考点串成一道简单应用题

题目大意:文件里每行是一个「姓名,成绩」,统计每个分数段的人数,并按人数从多到少输出。这道题同时用到文件读取、字典计数、排序和格式化输出,是简单应用的典型结构。

level = {"优秀": 0, "良好": 0, "及格": 0, "不及格": 0} with open("data.txt", "r", encoding="utf-8") as f: for line in f: name, score = line.strip().split(",") # 解包成两个变量 score = int(score) if score >= 90: level["优秀"] += 1 elif score >= 75: level["良好"] += 1 elif score >= 60: level["及格"] += 1 else: level["不及格"] += 1 for k, v in sorted(level.items(), key=lambda kv: kv[1], reverse=True): print("{}:{}".format(k, v))

name, score = ...split(",")是解包,左边变量个数必须和切出来的段数一致,多了少了都会报 ValueError——如果某行末尾多一个逗号,这里就会崩,所以稳妥写法是先判断len(parts) == 2。sorted(..., reverse=True)表示降序,等价于对数值取负再排序。"{}:{}".format(k, v)中间那个冒号是输出格式的一部分,全角半角必须和题目要求一致。这类题拿满分的标准不是「写出来能跑」,而是「输出和样例一字不差」。

4. 五个高频失分点:明明会写,分却没了

4.1 把切片和赋值当成一回事

错在哪:看到b = a[:]和b = a觉得效果一样,改 b 的时候以为 a 也会变,或者反过来。

为什么错:b = a只是给同一个列表对象多起了一个名字,两者共享内存;a[:]和a[1:4]是切片,会新建一个列表,元素是原元素的浅拷贝。二级的选择题和操作题都喜欢在这里设卡。

怎么答对:记住一句判断口诀——「有切片就是新对象,没切片就是起外号」。做题时如果看到b = a后面又改了 b,先在草稿上写「a 也变了」;看到切片,就写「a 不变」。再进一步,嵌套列表的切片仍然是浅拷贝,改内层列表两边都会变,这个层次在难题里会出现。

4.2 print 的输出格式和标准答案差一个字符

错在哪:结果算对了,输出写成print("平均分:", avg),标准答案是平均分:85.50,中间多一个空格,直接判错。

为什么错:机器判分做的是字符串比对,不是人眼比对。print用逗号分隔多个参数时会自动插入一个空格,这个空格就是最常见的扣分点。

怎么答对:能用一次格式化搞定就不要用逗号拼。print("平均分:{:.2f}".format(avg))或者print(f"平均分:{avg:.2f}"),冒号后面紧跟格式,不会凭空多空格。交卷前把输出和自己写的预期输出逐字符对一遍,重点看空格、冒号、括号的全半角。

4.3 文件读进来是乱码或者直接报编码错误

错在哪:open("data.txt", "r")写完就交,本地跑没问题,考场环境一跑就 UnicodeDecodeError。

为什么错:不指定 encoding 时用的是系统默认编码,不同机器默认值不一样,中文内容尤其容易出问题。

怎么答对:所有文本文件的 open 都补上encoding="utf-8",养成肌肉记忆。读取后如果发现内容带一堆\ufeff或者乱码,先怀疑编码,不要怀疑自己的循环写错了。

4.4 range 和索引的边界算错

错在哪:要取 1 到 100 的偶数,写成range(1, 100, 2),或者遍历列表时用for i in range(len(lst)+1)。

为什么错:range 的终止值取不到,range(1, 100, 2)到 99 就停了;len(lst)+1会越界抛 IndexError。这两个都是「看着像对的」的错。

怎么答对:写 range 之前在旁边标注「左闭右开」,取 1 到 100 就写range(1, 101)。遍历列表优先用for x in lst直接拿元素,需要下标时才用enumerate(lst),从根上避免越界。

4.5 缩进、中文标点和全角空格

错在哪:从题目里复制代码下来,if后面的冒号是中文全角「:」,或者缩进混用了空格和 Tab。

为什么错:Python 靠缩进划分代码块,混用 Tab 和空格会直接抛 IndentationError;全角标点是语法错误,但肉眼几乎看不出来。

怎么答对:考场上不要从题面复制代码,手敲。交卷前把编辑器切到显示空白字符的模式扫一眼,或者在命令行跑一次,能跑通再保存。这种错误最冤,因为你会写,只是打错了。

5. 综合应用 20 分大题:从读题到交卷的五步流程

5.1 读题:先把自然语言翻译成数据结构和步骤

综合应用丢分,八成不是不会写代码,而是没读懂要什么。拿到题先做三件事:圈出输入是什么(文件名、每行几个字段、用什么分隔)、圈出要算什么(求和、计数、去重、排序)、圈出输出到哪(打印还是写文件、保留几位小数、分隔符是什么)。

比如题目说「读取文件,统计每个班级的平均分,按平均分从高到低输出到 result.txt,每行格式为班级:平均分」,拆出来就是:数据是字典{班级: [分数列表]},算法是先分组再求均值,输出是先排序再按格式写文件。这一步用笔写在草稿纸上,比直接在编辑器里试错快得多。

注意:题目里出现的样例输出一定要逐字符看,包括冒号前后有没有空格、小数点后几位、行末有没有空行。

5.2 写代码:先搭骨架,再填细节

骨架永远是五步:读、拆、算、排、写。先把这五步用注释写出来,再一段一段填,哪怕某一算不会,也能拿到读文件和写文件的分。

# 第一步:读 with open("score.txt", "r", encoding="utf-8") as f: lines = f.readlines() # 第二步:拆,把每行拆成 班级 和 分数 data = {} for line in lines: parts = line.strip().split(",") if len(parts) != 2: # 防御性判断,跳过脏数据行 continue cls, score = parts[0], int(parts[1]) data.setdefault(cls, []).append(score) # 键不存在时先建空列表 # 第三步:算平均分 avg = {} for cls, scores in data.items(): avg[cls] = sum(scores) / len(scores) # 第四步:排序 result = sorted(avg.items(), key=lambda kv: kv[1], reverse=True) # 第五步:写 with open("result.txt", "w", encoding="utf-8") as f: for cls, a in result: f.write("{}:{:.2f}\n".format(cls, a))

setdefault(cls, [])的意思是「键存在就返回它的值,不存在就先塞一个空列表再返回」,用它做分组比写 if 判断短。sum(scores)是内置函数,比手写循环快且不容易错。f.write不自动换行,所以格式串末尾必须手动加\n,这一点和 print 完全不同,是写文件时最常见的失分点。写模式用w,如果文件已存在会被覆盖,正好符合「重新生成结果」的要求。

5.3 自测:交卷前把这三件事过一遍

第一,把中间结果打出来看。在算完之后加一句print(data),确认分组对不对、有没有空列表、分数是不是都转成了 int。确认没问题再删掉,别带着调试输出交卷。

第二,用边界数据试。空文件、只有一行、某行少一个字段、分数是 0 分——这几种情况考场上不一定有,但你得知道自己的代码会崩在哪。

第三,对输出格式。把程序输出和题目给的样例并排放,一个字符一个字符比。多一个空格、少一个换行、小数位数不对,全在这时候改。这三步加起来五分钟,能救回来的分数往往不止五分。

6. 120 分钟怎么切:考场节奏与最后三分钟检查清单

上机最怕的不是难题,是时间分配失控。我的建议是把 120 分钟切成四段,每段都有明确的收尾动作,到点就往下走,不要在一道题上反复纠结。

时间段做什么到点必须完成
0~10 分钟通览全卷,给三道操作题标难度决定先做哪道
10~35 分钟基本操作 3 小题三道全部填完并运行
35~75 分钟简单应用 2 小题至少一道完全跑通
75~110 分钟综合应用读文件、写文件两段必须先写出来
110~120 分钟全卷复查输出格式、文件名、缩进

这里有个反直觉的建议:综合应用不要留到最后二十分钟才开始。它 20 分,是单题分值最高的,而且「读文件」和「写文件」这两段是模板化的,写出来就有分,中间那部分算不出来也只是少几分。所以真正合理的顺序是:先扫一遍,把最有把握的基本操作做完,然后立刻去写综合应用的骨架,再回头做简单应用,最后补综合应用的细节。会做的先做完,能拿的分先拿到手,这个次序比什么都重要。

复查清单可以短,但必须固定:

# 交卷前的自查,不需要写进程序,逐条对一遍即可 # 1. 文件名是否和题目要求完全一致(含扩展名、大小写) # 2. open 是否都带了 encoding="utf-8" # 3. 输出的小数位数、分隔符、中文冒号是否和样例一致 # 4. 文件写入是否手动加了 \n,最后一行有没有多余空行 # 5. 每道题是否都点过「运行」,确认没有红色报错

第 5 条最容易被忽略:很多人改完代码就直接保存交卷,没再跑一次,结果改出来一个缩进错误,前面全白做。运行一次只要几秒钟,代价却可能是整道题的分数。

说个我自己的教训。早年第一次上机,基本操作三道题我十分钟就填完了,心里美滋滋,然后在一道简单应用上死磕了四十分钟,改来改去,最后综合应用只剩十五分钟,读文件的代码写到一半就交卷了。出分那天我才明白,那四十分钟换来的可能只是 3 分,而丢掉的是一整道 20 分的大题。从那以后我每次进考场,都强制自己按「先扫全卷、再抢模板分、最后磕细节」的顺序走一遍,哪怕题目看着很简单也不跳步。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询