简介:这套题库面向全国计算机等级考试二级Python科目,适合备考学生、培训讲师和需要系统刷题的自学者,可用于章节练习、专项突破、模拟测试和考前查漏补缺,也可作为课堂教学与上机辅导的辅助材料。压缩包共205个文件、约831KB,以129个Python脚本和50个文本文件为主体,辅以PNG/JPG图片、Markdown说明、DAT/CSV数据及许可证文件,兼顾题目、参考答案、运行示例与数据素材,便于按知识点检索并在本地反复练习。内容涉及基础语法、数据类型、流程控制、函数、文件操作、CSV数据处理与程序输出校验等常见考点,读者可结合可运行脚本对照答案验证结果,利用刷题经验与README说明梳理题目组织方式、常见题型和易错点。已有4478人学习,适合希望借助现成题库和代码示例巩固二级Python应试能力、提升程序设计思路与上机操作熟练度的读者。
1. 知识地图:二级 Python 的分数是怎么摊开的
「python 计算机二级题库」这类资源一直有人反复找,原因不难理解:二级 Python 的考点分布极不均匀。40 分选择题里固定有 10 分跟 Python 本身无关,剩下 60 分全是上机写代码,写不出来就是零分,没有中间地带。
整张卷子的知识地图其实只有三层:最底层是公共基础,数据结构、算法、软件工程、数据库;中间层是语言本体,语法、数据类型、控制结构、函数、类;最上层是应用层,文件读写、标准库、第三方生态。多数人复习时把九成时间砸在中间层,结果选择题前十题错一半,综合应用题又在文件读写和格式转换上卡住。
这张地图先记住:公共基础不靠刷 Python 补,语言本体靠读代码养手感,应用层靠固定题型练套路。它适合已经写过一点 Python、准备把分数稳定拉过及格线的人。
2. 公共基础:40 分选择题里那 10 分怎么稳住
公共基础这 10 分是整张卷子里性价比最高也最容易被放弃的部分。它不考 Python 语法,考的是计算机专业基础课里最经典的那几块骨架,题目形式以「下列说法中正确的是」为主,判断题居多。很多人一上来就闷头刷编程题,这 10 分全靠考场上蒙,正确率常年在 40% 上下徘徊,等于还没开始就丢了 6 分。
2.1 数据结构与算法:四个必考模型
这块通常占 4 到 5 道选择题,是整个公共基础里分值最重的一段。出题点非常集中,翻来覆去就是栈、队列、线性链表、二叉树、排序查找这五类,而且每类都有固定的问法和固定的解法。
| 考点 | 常见问法 | 记忆要点 |
|---|---|---|
| 栈 | 给入栈序列,问哪个出栈序列不可能 | 后进先出,任意时刻只能弹出栈顶元素 |
| 循环队列 | 已知 front、rear 求元素个数 | (rear - front + 容量) % 容量 |
| 线性链表 | 插入、删除是否需要移动元素 | 只改指针,时间复杂度 O(1) |
| 二叉树 | 给两种遍历序列,还原树或求另一种序列 | 前序根左右、中序左根右、后序左右根 |
| 排序 | 冒泡、快排的比较次数与稳定性 | 冒泡最坏比较n(n-1)/2次 |
二叉树的题最值得单独练。常见套路是给出前序和中序,让你推出后序:前序第一个元素是根,拿着这个根去中序里一切两半,左边是左子树、右边是右子树,然后对两半递归做同样的事。这个手推流程练三五遍就成本能了。还有一个被反复考的性质:任意一棵非空二叉树,叶子结点数总比度为 2 的结点数多 1,即n0 = n2 + 1。
排序部分要背的不是代码,是量级和稳定性。冒泡、直接插入、简单选择都是 O(n²);快速排序平均 O(nlog₂n)、最坏退化成 O(n²);二分查找要求数据有序。这些结论在选择题里出现的频率高得离谱,属于看到就该条件反射的档次。
注意:循环队列公式里的「容量」是数组长度,不是元素个数加一,很多题会在这里设一个陷阱选项。
2.2 软件工程与数据库:背结构,不背原文
这两块加起来一般 5 到 6 道题,特点是概念多、彼此独立,但考法极其固定,几乎不出现需要推理的新题型。
软件工程部分集中在三条线。第一条是软件生命周期,顺序是可行性研究、需求分析、总体设计、详细设计、编码、测试、维护,题目常问「哪个阶段开始」或者「维护阶段占成本比例最高」。第二条是结构化方法,核心是数据流图 DFD,图里只有四种元素:加工、数据流、数据存储、外部实体,考试会让你数某一种有几个,或者判断某两个元素之间能不能直接连线。第三条是测试,白盒测试按覆盖程度从弱到强是语句覆盖、判定覆盖、条件覆盖、路径覆盖,黑盒测试主要是等价类划分和边界值分析。
| 范式 | 要消除的依赖 | 一句话记法 |
|---|---|---|
| 1NF | 属性不可再分 | 表里不能套表 |
| 2NF | 非主属性对码的部分依赖 | 联合主键时不能只依赖其中一半 |
| 3NF | 非主属性对码的传递依赖 | 不能出现 A→B→C 的绕路 |
数据库部分的核心是 E-R 图转关系模式和三大范式。E-R 图里矩形是实体、椭圆是属性、菱形是联系;一对一联系不产生新表,多对多联系必须单独建一张表。SQL 语句只考最基础的一层:SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...,配合COUNT、SUM、AVG这类聚合函数,能看懂语句在干什么就够了,不会让你写复杂查询。
2.3 题型与分值:时间该往哪里投
整张卷子的分值和时长分配大致是稳定的,把它摊开看,你会立刻明白复习重心该放哪。
| 题型 | 题量 | 分值 | 建议用时 |
|---|---|---|---|
| 单项选择题 | 40 题 | 40 分 | 30 分钟 |
| 基本操作题 | 3 题 | 15 分 | 20 分钟 |
| 简单应用题 | 2 题 | 25 分 | 30 分钟 |
| 综合应用题 | 1 题 | 20 分 | 40 分钟 |
选择题每题 1 分,错了不扣分,但 40 道题要在 30 分钟内做完,平均 45 秒一道,公共基础那 10 题一旦卡住就会拖垮后面。基本操作题通常考的是从键盘输入、简单计算、字符串处理这类最基础的填空,属于必须拿满的部分;简单应用题一般是列表、字典的统计处理;综合应用题则是「读文件—处理数据—写文件」的完整流程,20 分里常常按步骤给分,即使最后结果不对,把输入输出和中间变量写对也能拿一部分。
合理顺序是:先扫一遍选择题,把会做的做完;再冲基本操作题保分;然后做简单应用;最后留足时间给综合应用题。综合应用题千万别空着,open和close写对了就有分。
3. 语言核心:缩进、切片与四种容器的分工
语言本体这 30 分选择题加上全部上机题,是真正的重心。它不像公共基础那样能靠背,但也不是靠天赋,考的都是有明确边界的基础操作,把边界摸清楚就能稳住。
3.1 语法元素:缩进是语法,优先级是常识
Python 用缩进划分代码块,这不是风格问题而是语法问题。四个空格是通用写法,混用 Tab 和空格会直接抛IndentationError,在考场上这种错误最冤。
运算符优先级需要背的顺序是:幂运算**最高,然后是一元运算符,接着是* / // %,再到+ -,再到比较运算符,然后not、and、or,最后是赋值。注意not的优先级比and高,and又比or高,这三者的顺序是选择题的常客。
# 整除与取余:负数时向下取整,不是截断 print(7 // 2, 7 % 2) # 3 1 print(-7 // 2, -7 % 2) # -4 1 print(2 ** 3 ** 2) # 512,幂运算右结合 print(0.1 + 0.2 == 0.3) # False,浮点数不能直接比较相等负数整除结果是-4而不是-3,因为 Python 的//是向负无穷取整;%的结果符号跟随除数而不是被除数,所以-7 % 2得1。浮点数比较要写成abs(a - b) < 1e-9,直接==一定翻车。这几个点在判断题和代码阅读题里出现频率极高。
input()函数永远返回字符串,要参与算术必须转换。int("3.5")会抛ValueError,得先float再int。print的sep和end两个参数要会用,print(1, 2, 3, sep="-")输出1-2-3。
3.2 字符串与切片:负数下标和步长
切片是 Python 最送分也最容易送命的地方,语法是[start:stop:step],三个参数都可以省略,左闭右开,step为负时方向反转。
s = "0123456789" print(s[2:8]) # 234567 左闭右开 print(s[2:8:2]) # 246 从 2 开始每 2 个取一个 print(s[-3:]) # 789 倒数三个 print(s[::-1]) # 9876543210 反转字符串 print(s[8:2:-1]) # 876543 步长为负,起点必须大于终点最后一行是最容易错的形式:当步长为负数时,起点要大于终点,否则得到空字符串。还有一个经典陷阱是越界,切片越界不报错,s[100:]返回空串,但用下标访问s[100]会抛IndexError,这两种情况的区别必须分清。
字符串方法里高频的是strip()去首尾空白、split()按分隔符切分、join()拼接、replace()替换、find()返回下标(找不到返回-1)、count()计数。格式化三种写法都要认识:"%d" % x、"{:.2f}".format(x)、f"{x:.2f}",其中:.2f表示保留两位小数,:>8表示右对齐占八位。
3.3 四种容器:可变、有序、可哈希的分工
列表、元组、字典、集合这四个结构的选择题,本质是在考三组属性:可变不可变、有序无序、元素可不可重复。
| 类型 | 可变 | 有序 | 元素重复 | 典型场景 | 定义写法 |
|---|---|---|---|---|---|
| list | 是 | 是 | 允许 | 顺序处理、排序 | [1, 2, 3] |
| tuple | 否 | 是 | 允许 | 固定结构、多返回值 | (1, 2, 3) |
| dict | 是 | 保留插入顺序 | 键唯一 | 计数、映射 | {"a": 1} |
| set | 是 | 否 | 不允许 | 去重、交并差 | {1, 2, 3} |
字典和集合的查找是常数级 O(1),列表是 O(n),这条结论在选择题里以「哪个结构查找最快」的形式反复出现。字典的键必须是可哈希的,列表和字典不能当键,元组可以,因为元组不可变。
words = ["a", "b", "a", "c", "a"] count = {} for w in words: count[w] = count.get(w, 0) + 1 # get 的默认值避免 KeyError print(count) # {'a': 3, 'b': 1, 'c': 1} nums = [3, 1, 3, 2, 1] print(sorted(set(nums))) # [1, 2, 3] 先去重再排序 print([x ** 2 for x in nums if x > 1]) # [9, 9, 4] 列表推导式统计类题目几乎每题都用到count.get(k, 0) + 1这个写法,它比if k in count更简洁也更不容易出错。列表推导式则能把「遍历 + 过滤 + 变换」压缩成一行,考场上能省不少时间。
3.4 分支、循环与异常:循环的 else 和 try 的位置
分支写if/elif/else,Python 没有switch。循环里break跳出整个循环,continue跳过本次,这两个用得最多。真正容易被忽略的是for...else结构:else块只在循环正常结束(没有被break打断)时执行。
for n in range(2, 10): for i in range(2, n): if n % i == 0: break else: print(n, end=" ") # 2 3 5 7,else 属于内层 for这个结构在找素数、找满足条件的第一个数时特别好用,但因为太少见,很多人在考场上认不出来。注意else的缩进层级决定了它属于哪一层循环,缩进错一级语义就完全变了。
异常处理的结构是try / except / else / finally,else在没有异常时执行,finally无论有没有异常都执行。必须认识的异常类型有:ValueError类型转换失败、ZeroDivisionError除零、IndexError下标越界、KeyError字典键不存在、TypeError类型不匹配、NameError名字未定义。选择题常给一段代码问「抛出什么异常」,判断的关键就是看最后一步操作碰到了哪个边界。
4. 函数与生态:从 def、class 到 import 的整条链
到了函数、类和库这一层,考法从「读结果」变成「读结构」。你得看得懂一个函数怎么收参数、一个类怎么建实例、一个模块怎么被导入,否则综合应用题里的代码根本读不下去。
4.1 函数参数:四类参数的顺序不能乱
Python 函数的参数按顺序排是:位置参数、默认参数、可变位置参数*args、可变关键字参数**kwargs。这个顺序是语法强制的,写反了直接报错。
def report(name, *scores, level="B", **extra): total = sum(scores) return f"{name}-{total}-{level}-{extra.get('city', 'NA')}" print(report("A", 80, 90, level="A", city="X")) # A-170-A-X*scores把所有多余的位置参数打包成元组,**extra把所有多余的关键字参数打包成字典。默认参数有一个必须记住的坑:默认值只在函数定义时求值一次,如果默认值是可变对象(列表、字典),它会在多次调用之间共享。
def add(item, box=[]): # 默认值在定义时创建,全程复用同一个列表 box.append(item) return box print(add(1)) # [1] print(add(2)) # [1, 2],不是 [2]正确写法是默认值设成None,函数内部再判断并新建列表。这个知识点几乎每隔一两年就出现在选择题里,属于必背。
4.2 作用域与递归:LEGB 与递归三要素
变量查找顺序是 LEGB:Local 局部、Enclosing 嵌套函数外层、Global 全局、Built-in 内置。函数内部给变量赋值会创建局部变量,想改全局变量必须global声明,想改嵌套外层的变量必须nonlocal声明。
x = 1 def outer(): x = 2 def inner(): nonlocal x # 不加这句,下面就是新建局部变量 x += 1 return x return inner() print(outer(), x) # 3 1,全局 x 没被动过递归考的是三要素:终止条件、递推关系、每层规模缩小。阶乘、斐波那契、汉诺塔是三个固定模板,考试一般只要求读出递归调用的次数或者写出终止条件。斐波那契的朴素递归会重复计算大量子问题,这个「效率低」的结论本身也是考点。
4.3 类与对象:类属性和实例属性不是一回事
定义类的关键字是class,构造方法__init__,实例方法的第一个参数固定是self。判断一个属性属于类还是属于实例,看它写在哪里:写在__init__里的是实例属性,每个对象一份;写在类体里的是类属性,所有对象共享。
class Student: count = 0 # 类属性,全类共享 def __init__(self, name, score): self.name = name # 实例属性 self.score = score Student.count += 1 def __str__(self): # 打印对象时调用 return f"{self.name}:{self.score}" a = Student("A", 90) b = Student("B", 85) print(a, Student.count) # A:90 2继承的写法是class Sub(Base),子类调用父类方法用super().__init__(...)。选择题常问「子类重写方法后调用的是哪个」,答案取决于实例的实际类型,跟变量的声明无关。特殊方法里除了__init__,最常考的是__str__,它决定了print一个对象时输出什么。
4.4 文件读写:open 的三个关键参数
文件操作是综合应用题的必考骨架,open的三个参数是路径、模式、编码。模式里r只读、w覆盖写、a追加写,加b是二进制,加+是可读可写。
# 按行读取 CSV,统计每行第二列的总和 total = 0 with open("score.csv", "r", encoding="utf-8") as f: next(f) # 跳过表头 for line in f: parts = line.strip().split(",") # strip 去掉行尾换行 total += float(parts[1]) print(total)with语句会在代码块结束时自动关闭文件,比手动close()更安全,考试里推荐一律用它。line.strip()这一步绝不能省,行尾的\n会让最后一列比较永远不相等。写入时f.write()不会自动加换行,要手动写"\n",这是另一个高频错误点。
数据的组织方式也要清楚:一维数据用列表表示,二维数据用二维列表表示,CSV 就是二维数据的文本格式。JSON 的处理用json.dumps()转字符串、json.loads()转对象、json.dump()和json.load()直接操作文件,这几个函数名的区别要分清,s结尾的是操作字符串的。
4.5 标准库与第三方库:考试范围内就那几个
标准库考random、time、math、turtle、jieba,第三方库考wordcloud、matplotlib、numpy、PIL、pyinstaller,基本都停在「知道它是干什么的、哪个函数做什么」这个层面。
| 库 | 高频函数 | 常见考法 |
|---|---|---|
| random | random()、randint(a,b)、choice()、shuffle()、seed() | 生成随机数、打乱列表 |
| time | time()、strftime()、strptime()、sleep() | 时间格式化、程序计时 |
| math | pi、sqrt()、ceil()、floor()、log() | 数学计算 |
| turtle | forward()、circle()、penup()、goto()、done() | 绘图逻辑判断 |
| jieba | lcut()、cut()、add_word() | 中文分词 |
| wordcloud | WordCloud()、fit_words()、to_file() | 词云生成 |
| pyinstaller | -F、-w | 打包成可执行文件 |
random有个容易混的组合:random()返回[0,1)的浮点数,randint(a,b)返回[a,b]两端的整数,randrange(a,b)则是左闭右开。turtle一般不要求写完整绘图代码,只给一段代码问「画出什么图形」,重点看方向和角度的累加。jieba.lcut()返回列表,jieba.cut()返回生成器,这个区别偶尔会考。
5. 易错点:五个一考就变红灯的细节
每年卷面上翻车的地方,其实高度重复。下面这五个是复习时最容易漏、考场上最容易犯的,每一条都按「漏在哪、为什么漏、怎么补」说清楚。
5.1 易漏点一:可变对象作为默认参数
漏在哪:def f(x, box=[])这种写法,很多人觉得既然语法不报错就没问题。
为什么漏:默认值只在函数定义时求值一次,后面每次调用都复用同一个列表对象,于是第二次调用会看到上一次的残留数据。它不报错、不崩溃,只是结果悄悄错了。
怎么补:默认值一律设为None,函数体第一行判断if box is None: box = []。练题时看到默认值是[]或{}的代码题,第一反应就该是「这里有坑」。
5.2 易漏点二:遍历列表时删除元素
漏在哪:for n in nums: if n == 2: nums.remove(n),看着逻辑通顺。
为什么漏:遍历时列表同时在被修改,索引会整体前移,紧挨着的相同元素直接被跳过。结果是只有一部分被删掉。
怎么补:要么用列表推导式重建nums = [n for n in nums if n != 2],要么遍历副本for n in nums[:]。考场上凡是见到「边遍历边删除」,先警觉。
5.3 易漏点三:文件忘关、编码忘写
漏在哪:f = open("a.txt", "r")之后直接读,不关也不指定编码。
为什么漏:不关文件在数据量大时可能丢数据;不指定encoding时用的是系统默认编码,中文一读就乱码或者直接抛UnicodeDecodeError。
怎么补:一律用with open(..., encoding="utf-8")。题目里给出的文本文件如果没有声明编码,读的时候照抄题目给的编码,别自己发挥。
5.4 易漏点四:import 的几种写法混着用
漏在哪:import random和from random import randint分不清,后面直接写random()。
为什么漏:import random之后必须写random.random();from random import random之后才能写random()。写成import random再调random(),报的是NameError或者把模块当函数调用。
怎么补:记住一条规则——import 模块保留前缀,from 模块 import 名字去掉前缀。选择题里出现import的,先数一下名字前面有没有模块名。
5.5 易漏点五:格式化输出里的小数位和符号
漏在哪:"{:.2f}".format(1.005)得到1.00,很多人以为会四舍五入成1.01。
为什么漏:浮点数本身存不下精确值,1.005在二进制里是无限循环小数,存进去时就已经比真实值小一点,再四舍五入自然向下走。
怎么补:理解「格式化不是数学运算」,遇到这种边界宁可相信结果就是1.00。另外%格式化里%d是整数、%f默认六位小数、%.2f是两位,这三者的区别要背下来,考场上没时间查。
6. 复习清单:按题型倒推的四周刷题法
复习到这一步,最怕的是「知识点都看过,一做题就卡」。原因通常不在知识量,而在训练方式和考试形式不匹配——平时看着答案点头,考场上没有答案可看。所以最后这段落到具体做法上。
第一周只做公共基础和选择题。每天划出四十分钟,专攻数据结构和算法那十几页,把栈、队列、二叉树、排序四类题的判断口诀抄在一张纸上,做错的题在纸背面写一句「我当时是怎么想的」,这句反思比正确答案值钱。第二周转向语言本体,重点刷代码阅读题:给一段代码问输出,先自己跑一遍心算,再对答案,错了就手写一遍。这一周的目标不是做对,而是把「看代码」的速度提上来。
第三周开始做大题,按题型分块。基本操作题三天拿下,简单应用题四天,综合应用题留足一周。综合题的做法是背骨架而不是背答案:读文件、处理、写文件这三段先默写下来,再往里填具体逻辑。
| 阶段 | 主攻内容 | 每日题量 | 验收标准 |
|---|---|---|---|
| 第一周 | 公共基础 + 选择题 | 40 题 | 选择题正确率 80% 以上 |
| 第二周 | 语法、数据类型、代码阅读 | 30 题 | 心算输出与实际一致 |
| 第三周 | 三类上机题 | 5 大题 | 综合题能独立写完 |
| 第四周 | 整套模拟 + 错题回炉 | 2 套 | 限时 120 分钟内完成 |
第四周只做两件事:整卷限时模拟,和错题回炉。错题回炉的方法是把错题按「知识点」而不是按「题号」归类,同一类错三次的,说明是真漏洞,回到对应模块重看一遍;只错一次的,多半是手滑,记一笔就走。
题库的价值在这个阶段才真正体现出来:它不是为了让你「多做几道」,而是为了让你在同类题里反复撞到同一个坑,直到形成条件反射。
提示:模拟时一定要用纸笔或者关掉自动补全的编辑器,考场上没有代码补全,手感差很多。
我自己的血泪经验是,第一次考的时候把题库当小说看,正确率看着挺高,一上机连open的参数都写不利索。从那以后我每次复习都强制走一遍「手写—运行—对照」的流程:先在纸上把代码写完整,再敲进编辑器跑,最后跟答案逐行比对差异。慢是慢,但一遍顶三遍。
希望帮到你。
本文还有配套的精品资源,点击获取