简介:面向全国计算机二级Python备考的完整题库资源,覆盖选择、操作、综合应用等常见题型,适合需要系统刷题与对照答案的考生、培训讲师及自学人群。资源共205个文件,压缩包约831KB,其中129个py源代码文件用于还原编程题实现与解析过程,50个txt文本文件主要存放题目、答案与知识点说明,另有png/jpg图片辅助展示运行效果,以及md说明、csv数据样本等补充材料,整体目录结构清晰,便于按模块逐类练习。试题覆盖基础语法、数据类型、函数、文件操作与常用第三方库等二级考试主干内容,按章节归类的题目便于边学边练;每道题均提供答案与解析思路,适宜对照源码逐段研读。目前已有4470人学习下载,题库包含大量带答案的练习内容,并在README与刷题经验文档中整理了备考要点与常见坑位,可帮助读者高效定位薄弱环节、理解代码逻辑、掌握二级考试高频考点,适合考前冲刺与日常训练。
1. Python二级知识地图:基础考点到综合应用的主线顺序
想通过 Python计算机二级,刷题固然重要,但有经验的备考者都知道,一上来就打开 python二级题库从头做到尾,反而容易陷入“会的反复刷、不会的永远碰不到”的怪圈。真正的复习起点是先建立一张知识地图:把二级考试的命题主线拆成“基础语法与数据类型 → 程序控制结构与函数 → 组合数据类型 → 文件读写与标准库 → 综合应用”这五段,再带着这张主线图去逐项扫雷。从历年题目的反馈来看,选择题里的类型判断题、操作题里的格式化输出题、以及综合题里的文件处理题,全部都挂在这条主线上;把地图立起来,后面每一步查漏补缺才有依据。本文就按这条主干往下展开,重点标出最值得你花时间的地方。
2. 基础语法与数据类型:运算符优先级、类型转换与三种格式化对比
Python 二级卷面里,纯 Python 基础题大约占 20 分,公共基础部分另占 10 分。基础题单看分值不高,却是所有程序填空题和操作题的隐性依赖——很多人做大题中途“卡壳”,回头一查,发现只是表达式优先级或类型转换这一步理解偏了。梳理二级基础考点,可以分成三个稳定出题的板块:内置类型的边界、运算符优先级、格式化输出的写法。
2.1 数值、字符串、布尔:类型边界与相互转换
复习这一块,先记住一条原则:Python 是动态类型语言,类型不是写在变量名上的,而是运行时绑定在对象上。所以选择题里出现type(x)、isinstance(x, 类型)的判断时,关键不在于“这个变量是什么类型”,而在于“这个对象当前是什么类型”。
| 类型 | 可变性 | 典型创建写法 | 常被考到的点 |
|---|---|---|---|
| int | 不可变 | 10、0x1F、int("12") | 整数没有长度上限,除零抛ZeroDivisionError |
| float | 不可变 | 3.14、float("2.5") | /运算结果恒为 float |
| bool | 不可变 | True/False | 属于 int 子类,参与算术时当成 1 和 0 |
| str | 不可变 | "abc"、str(123) | 支持索引、切片、连接和乘法 |
| list | 可变 | [1, 2]、list("ab") | 存储对象引用,因此有“原地修改”的副作用 |
| tuple | 不可变 | (1, 2)、1, 2 | 可哈希,能当字典键 |
| dict | 可变 | {"a": 1} | Python 3.6 后保持插入顺序 |
| set | 可变 | {1, 2}、set([1, 2]) | 元素必须可哈希,重复元素自动去重 |
最容易丢分的是“bool 参与算术运算”这一类。例如1 + True的结果是2,False * 10的结果是0,原因就是 bool 按 int 子类处理。另一个高频考点是除法的类型:type(1 / 2)返回float,而type(1 // 2)返回int。C 语言习惯里“整数除整数得整数”的默认认知,放到 Python 3 里会直接翻车。
类型转换的方向也需要单独过一遍。int(3.9)得到3,这是向零截断;round(3.9)得到4,这是按舍入规则;int("-5.7")会抛异常,因为字符串转 int 不接受小数点。二级题库里常把这几组写法混在同一个选择题里,专门测试你对“截断”和“四舍五入”的区分。
>>> int(3.9) 3 >>> round(3.9) 4 >>> int("12") 12 >>> int("12.2") # ValueError,字符串里带小数点,int() 不接受>>> round(2.5) 2 >>> round(3.5) 4注意第二组结果:round(2.5)不是 3,而是 2。题目刷多以后你会发现,Python 的round()采用“银行家舍入”——精确等于某个半值(如 2.5)时,取偶数那一边。如果你为了应试强行记结论,请记“四舍六入五取偶”,不要记成数学课上的“四舍五入”。
2.2 运算符优先级:判断题里最稳定的失分区
运算符优先级几乎是每套 python 二级题库里都会出现的题型。完整优先级表很长,但从备考角度看,真正需要背下来的组合并不多,按“算术 → 比较 → 逻辑非 → 逻辑与 → 逻辑或 → 赋值”这条链记忆即可。
| 级别 | 运算符 | 说明 |
|---|---|---|
| 高 | *///% | 算术乘除取余 |
| 中 | +- | 算术加减 |
| 中高 | ==!=><>=<= | 比较运算 |
| 低 | not | 逻辑非 |
| 更低 | and | 逻辑与(短路) |
| 最低 | or | 逻辑或(短路) |
常考的一个坑是not与比较运算连用。例如not 3 > 2,按优先级先算3 > 2得到True,再做not True得到False。如果把not想成“前置于整个表达式”,真的会算成(not 3) > 2,结果完全不同——not 3是False,False > 2还是False,虽然数值碰巧一样,但碰上not 3 == 3这类题,两种理解就会产生截然不同的答案。
短路求值是这张优先级表的延伸考点。and和or求值到能确定结果的位置就停:0 and x直接返回 0,不会去碰 x;1 or x直接返回 1。选择题里喜欢这样出:给定a = 2 or 3,结果是 2;给定b = 0 and 4,结果是 0。记住“返回决定结果的最后一个对象”,而不是返回布尔值,很多选项就能一秒排除。
x = 0 or 7 print(x) # 7,因为 0 为假,继续取右侧,返回对象 7 y = 3 and 0 print(y) # 0,因为 3 为真,继续看右侧,返回对象 0这类“返回对象”的语义,和 C 语言“返回真/假”有本质区别。评审卷面反馈里,这种情况常被归为“读代码题最容易粗心的一种”——刷题时可以刻意把这类题单独摘一串,集中过一遍。
2.3 三种格式化输出:写法对比与细节差异
格式化输出在操作题前几行几乎必考。二级考试范围内,%格式化、str.format()、f-string 三种方式都出现过,后两者在新题库中占比更高。
| 写法 | 示例 | 适用场景 |
|---|---|---|
%格式化 | "%5.1f" % 3.14159 | 老代码阅读题 |
format() | "{:.1f}".format(3.14159) | 题库标准写法 |
| f-string | f"{3.14159:.1f}" | 最直白,推荐优先掌握 |
pi = 3.14159 print("%.2f" % pi) # 3.14 print("{:.2f}".format(pi)) # 3.14 print(f"{pi:.2f}") # 3.14宽度和对齐是另一个容易被忽略的细节。f"{num:>10}"表示右对齐宽度 10;f"{num:<10}"左对齐;f"{num:^10}"居中。当操作题要求“输出占 10 个宽度、左对齐、保留 1 位小数”时,正确的组合是f"{num:<10.1f}"——先对齐和宽度,再写小数位,顺序和format规范一致。很多人在这一步把10和1f的顺序颠倒成f"{num:.1f<10}",输出直接报错。
补充一个从题库里统计出来的高频记忆点:format 语法里,:后第一个位置是“填充与对齐”,第二个是“宽度”,第三个才是“精度”。刷 python 二级题库到后期,如果能做到看到描述、条件反射般写出完整格式串,这一小节的分数就稳了。
3. 程序控制、函数与字符串处理:分支循环语义与参数作用域
控制结构、函数、字符串处理这三个模块,在卷面上约占 30 分,是名副其实的“中枢考点”。选择题考查语义理解,操作题考查代码书写,程序填空题则把这三者混在一起考。这一章的重点不在“知道语法”,而在“能预判运行结果”。
3.1 选择结构:条件分支的完整写法与三元表达式
if/elif/else本身不难写,难点集中在两处:多分支的顺序敏感性和三元表达式的优先级。
score = 75 if score >= 90: level = "A" elif score >= 60: level = "B" else: level = "C" print(level) # B这个例子本身平平无奇,但把它改编成“先判断 score >= 60 再判断 score >= 90”时,75 分就会错误地落到 B 分支,很多粗心题正是利用这一点。分支顺序要按“从窄到宽”或“从高到低”排,先处理更具体的条件,再处理更宽泛的条件。
三元表达式x = a if 条件 else b的语义好理解,真正麻烦的是嵌套写法。考场环境下,过长的嵌套三元表达式容易看串层,建议做题时的策略是:选择题里遇到嵌套三元,先加括号来判断结合方向;操作题里自己写代码时,拆成普通 if 语句,不追求一行式。
3.2 循环结构:range、break、continue 与循环 else
循环相关的命题点比选择结构多一个层次,因为循环能考察“重复执行多少次”“何时跳出”“循环体是否被执行过”三个角度。
range()有三种常见形态:range(stop)、range(start, stop)、range(start, stop, step)。记住包前不包后,range(1, 5)产出 1 到 4,不产出 5。range(5, 0, -1)产出 5、4、3、2、1,这是倒序循环的标准写法。
for i in range(5, 0, -2): print(i, end=" ") # 输出: 5 3 1break与continue的作用对象是当前一层循环,但在题库里常被考成“嵌套循环中的跳出位置”。例如两层 for 循环内层写break,只中断内层循环,外层会继续往下走。判断时不要凭“直觉觉得 break 结束了所有循环”,要逐层追踪。
循环的else子句是 Python 独有、也最容易失分的语法点。for/while正常走完(没被 break 打断)时,else块会执行;一旦中间 break,else块被跳过,原因是break表示“循环非正常结束”,与教材里常见的“else 一定在循环结束后执行”印象完全相反。用代码记忆会更直观:
for i in range(3): if i == 1: break else: print("这段不会输出,因为被 break 打断")for i in range(3): pass else: print("这段会输出,循环正常耗尽") # 输出:这段会输出,循环正常耗尽3.3 函数:参数类型、作用域与默认值的注意点
Python 二级的函数题,重点集中在参数传递机制和变量作用域两个方向。参数部分先区分五类:
| 参数类型 | 写法 | 调用方式 |
|---|---|---|
| 位置参数 | def f(a, b) | f(1, 2)或f(a=1, b=2) |
| 默认参数 | def f(a, b=1) | 省略 b 时用默认值 |
| 关键字参数 | def f(**kw) | 收成字典 |
| 可变位置参数 | def f(*args) | 收成元组 |
| 仅限关键字参数 | def f(*, a) | 必须用a=...调用 |
最容易碰到的题是默认参数在定义时求值还是调用时求值。“默认参数在函数定义那一刻被创建”这个结论,是理解后续易错点的基础。看下面这段:
def add_item(item, container=[]): container.append(item) return container print(add_item(1)) # [1] print(add_item(2)) # [1, 2],同一个默认列表被二次修改对,默认列表容器在两次调用之间是同一个对象,第二次调用会看到第一次追加的元素。考试答案若写成[2],就踩进了可变默认参数的坑;正确做法是用None作为默认值,函数体内部再重新创建空列表。这一条我会在后面单独再列一处易错点,因为它几乎每年都有变体出现。
作用域方面,local变量的查找遵循局部优先,再向外层函数、全局、内置逐级找。容易错的是在函数内部直接给全局变量赋值后再读它,例如:
x = 10 def change(): x = 5 change() print(x) # 10,函数内部 x 是局部变量,不影响全局要想影响全局,必须在函数内部声明global x。二级题库里出现过把global声明的顺序写在赋值语句之后的情况——语法位置写错,照样会报 UnboundLocalError。刷题时如果遇到这类报错,先检查声明语句是否在赋值之前。
3.4 字符串处理:切片、拼接与内置方法的返回值
字符串在二级考试里既单独出题,又作为文件读写题的前置知识。它本身不可变,因此所有“看起来像修改”的方法都返回新字符串,原字符串不会被改动。这个特性需要专门记住,因为列表的很多方法(如append)会原地修改,两种行为混着记忆是错题高发区。
| 方法 | 返回结果 | 说明 |
|---|---|---|
s.lower() | 新字符串 | 不改变原串 |
s.strip() | 新字符串 | 去掉两端空白 |
s.split("sep") | 列表 | 默认按空白切 |
" ".join(列表) | 新字符串 | 列表元素拼成字符串 |
s.replace(a, b) | 新字符串 | 全部替换 |
s.find(sub) | 整数下标 | 找不到返回 -1 |
切片s[start:stop:step]与 range 规则一致,包前不包后。推荐对s[::-1]做专门记忆——它表示反转字符串。选择题里还出现过联想考点:s[3:1:-1]因为负步长会从右往左切,这与正步长的默认方向不同,容易造成思维的惯性冲突。
字符串拼接还有一个“省分点”:用+做大量拼接时,每次拼接都会生成新的字符串对象,效率低;对单个较小字符串拼接,题目中两种写法都能算出相同结果,所以不必纠结,按题目要求的复杂度完成即可。
4. 组合数据类型、文件读写与常用库:字典哈希、切片、文件编码的考点
这一章对应的是二级题库里篇幅最大、操作题最容易出综合场景的部分。列表与字典承担“存储”任务,文件负责“持久化”,标准库则提供现成工具。复习目标很明确:能默写常用 API,能读懂遍历逻辑,能正确处理读写文件时的编码与资源释放。
4.1 列表:切片三件套、列表推导式与排序
列表的切片语法是与字符串切片统一的那套规则,但列表切片会返回新列表。需要注意切片得到的是“原始列表元素的引用集合”,如果元素本身是可变对象,修改元素内部也会影响原列表——这题经常被当成“浅拷贝”考点来出。
a = [[1, 2], [3, 4]] b = a[:] # 切片复制外层列表 b[0].append(99) # 修改内层列表元素 print(a[0]) # [1, 2, 99],内层共享,原列表被影响sort()与sorted()的差异也属于必背清单:sort()原地修改列表并返回None,sorted()返回新列表。选择题里出现过print([3, 1].sort()),运行结果是None,如果你预期是[1, 3],就说明还没有建立“原地修改方法返回 None”的条件反射。
列表推导式[表达式 for 变量 in 可迭代对象 if 条件]几乎每年都出现在程序填空题中。它把一个“建空列表 → 循环 → append”的三步过程压缩成一行,要求复习时能双向转换:给出普通循环能改写成推导式,给出推导式能还原成普通循环。
nums = [1, 2, 3, 4] sq = [n * n for n in nums if n % 2 == 0] print(sq) # [4, 16]左半边的n * n是输出表达式,for n in nums是遍历源,if n % 2 == 0是过滤条件。方程题有时候把过滤条件拿掉,让你算“几个元素”,此时答案会从 2 变成 4;读题时仔细把三个部分拆开再看。
4.2 字典与集合:哈希语义与常用遍历方式
字典本质是一个哈希表,键必须可哈希,因此列表、字典这类可变对象不能做键,元组可以。卷面上关于“可哈希”的判断只需要掌握一条:不可变类型基本都能当键,可变类型基本不能。集合里的元素同样要求可哈希,这就是set([1, 2] + [1])能去重、而set([[1], [2]])会报 TypeError 的原因。
遍历字典有几种固定写法:
d = {"a": 1, "b": 2} for k in d: # 遍历键 print(k) for v in d.values(): # 遍历值 print(v) for k, v in d.items(): # 遍历键值对 print(k, v)把d.items()直接当列表用是错误的,它返回一个视图对象;如果需要下标访问,要先list(d.items())。二级操作题里出现过“按值排序输出字典”的要求,常用写法是sorted(d.items(), key=lambda x: x[1]),这里的key指定排序依据,选择题容易把 lambda 写作x而排序成了按键,必须看清比较对象是键还是值。
集合运算在二级题库中出现的频率略低于字典,但一旦出现就是送分题:A | B并集、A & B交集、A - B差集、A ^ B对称差集。四个符号的记忆可以通过数学课上的集合文氏图迁移过来,不用单独背。
4.3 文件读写:打开模式、资源释放与编码三处细节
文件读写题通常以一个完整的操作题场景出现:读取文本文件、按行处理、写回新文件。首先要分清楚三种打开模式:
| 模式 | 含义 | 指针位置 |
|---|---|---|
r | 只读,不存在报错 | 文件头 |
w | 只写,覆盖已有内容 | 文件头 |
a | 追加写,不存在则创建 | 文件尾 |
r+ | 读写,文件必须存在 | 文件头 |
w+ | 读写,不存在则创建 | 文件头 |
容易引起连锁错误的是w模式的“覆盖”属性:拿到题先写with open("out.txt", "w")再慢慢处理,结果第二次运行时把上一次的结果冲掉了。更规范的做法是先读、后处理、最后单独用写模式输出。
with open("data.txt", "r", encoding="utf-8") as f: lines = f.readlines() print(len(lines))with上下文管理器负责自动关闭文件,这是二级代码规范里的加分写法。养成习惯后不需要再写f.close(),但老式写法依然可能出现在阅读题里,所以要认识open()返回对象在使用完成后必须显式关闭,否则缓冲数据可能丢失。
编码参数是近两年题库里反复的考点。open()默认编码依赖操作系统,Windows 默认中文环境可能是 gbk,读取 utf-8 文件会出现UnicodeDecodeError。保险写法是显式传入encoding="utf-8",同时写文件时保持读写两端编码一致。如果只设读端编码而不设写端编码,写回的文件可能以系统默认编码保存,内容不变但文件编码混乱,后期再读就报错。
4.4 常用标准库:random、math 与 turtle 的固定考法
二级大纲明确列出的标准库范围较小,高频常考集中在random、math、turtle和time。这四个库的考点非常稳定,值得花半小时系统过一遍。
random的常考函数包括:
import random random.random() # [0.0, 1.0) 随机浮点数 random.randint(1, 6) # [1, 6] 闭环整数,可掷骰子的范围 random.randrange(1, 6) # [1, 6) 与 range 规则一致的整数 random.choice(["A", "B"]) # 随机取一个元素 random.shuffle(lst) # 原地随机打乱列表randint与randrange的边界问题是选择题的固定出题点。前者包含右端点,后者不包含,两个函数如果混淆,涉及概率题的结果会直接算错。math库常考ceil(向上取整)、floor(向下取整)、sqrt(平方根)、fabs(取绝对值)。其中math.ceil(2.1)得 3,math.floor(2.9)得 2,和int(2.9)得 2 放在一起对比记忆,能应对大部分判断题。turtle库在操作题里偶尔出现,需要记forward/backward/right/left/pencolor/done这几个基础方法。它不是复习难点,但常用方法名要能和参数数量对应上。
5. 易忽略与易错点盘点:四个最容易丢分的python二级题型陷阱
复习到后期,真正能拉开差距的往往不是“不会做”,而是“会做但掉进陷阱”。整理下来,以下四个点出现在不同年份的题目里,每次都是大面积失分。这部分的写法遵循一个套路:先看清易漏点,再理解为什么漏,最后把补救动作落死。
5.1 易漏点:input() 返回的是字符串,不是“看起来的类型”
a = input("请输入数字:"),此时 a 永远是 str。若用户输入12,a是字符串"12";若输入12.5,a 是"12.5"。只有显式调用int(a)或float(a)后,a 才变成对应数值。为什么容易漏:日常写脚本时,输入后紧接着做数学运算,如果是数值类型才成立;但考试代码里常把 input 的返回结果直接放进if a > 10这样的比较里,结果总在奇怪的地方翻车。怎么补:形成条件反射——看到input(),立刻在下两行内找类型转换。补一行a = int(a),或者直接在读取时写成a = int(input()),都不会再有隐式类型问题。此外,input("提示语")的提示语是输出到屏幕的,有的读代码题会问“程序运行后你看到什么”,答案是那行提示语,不是空字符串。
5.2 易漏点:默认参数的可变对象被多个调用共享
def f(x, lst=[])这个签名,默认列表在函数定义时只创建一次。后续所有没有传入第二个参数的调用,用的都是同一个列表对象。为什么容易漏:按直觉,每次调用都应该“重新得到一个新的空列表”,但 Python 的默认值语义不服务于“每次新建”这个直觉;只有函数的默认参数是常量(如数字、字符串、None)时,这种语义才没有副作用。怎么补:把可变类型默认值写成None,函数体第一行做判断:
def add_item(item, container=None): if container is None: container = [] container.append(item) return container这样每次调用都会创建独立列表。把这条写成代码贴在错题本第一页,几乎每次复习都能用上。
5.3 易漏点:浮点数比较的精度差与 round 的取偶规则
0.1 + 0.2 == 0.3的结果是 False。这不是 Python 的问题,而是二进制无法精确表示 0.1 和 0.2 的必然结果。二级题库里出现过“判断以下表达式的值”的单选题,也出现过让考生“比较两个浮点数大小”的操作题延伸。为什么容易漏:学十进制数学时“等于”是精确的,但计算机里的浮点存储是近似的;平时练习若只跑整数运算,永远不会暴露这个问题。怎么补:遇到浮点数比较,不要用==,改用“差的绝对值小于某个极小值”来判断:
def nearly_equal(a, b, tol=1e-9): return abs(a - b) < tol print(0.1 + 0.2 == 0.3) # False print(nearly_equal(0.1 + 0.2, 0.3)) # Trueround(2.5)取偶规则前面已经单独提过,这里再强调一遍:遇到题目给偶数边界(如 round(1.5) 得 2、round(2.5) 得 2),答案都不是下意识四舍五入的结果。
5.4 易漏点:写文件后数据未落盘,以及编码变量不一致
用open("out.txt", "w")写入后,如果不关闭文件,数据不一定真正写入磁盘,因为写入操作先进入内存缓冲区。为什么容易漏:在交互式解释器里执行三五行代码后立刻读取文件,有时能看到内容,有时看不到,容易误判“写成功了”,实则是解释器退出时自动 flush,掩盖了问题。怎么补:养成写文件用with open(...) as f的习惯,离开 with 块自动关闭并落盘;同时所有文件读写统一加encoding="utf-8",不要一边读文件用 utf-8,另一边写文件不指定编码。有的题目会故意“先以 utf-8 读取,再以系统默认编码写入”,读完写回后再以 utf-8 读就抛异常。遇到这种题,先检查两组 open 之间编码参数是否一致。
6. 考前复习清单与查漏补缺:用错题本定位知识盲区
错题本不是把题抄一遍,而是把考点标成三类:知识盲区、粗心区、速度区。知识盲区指“确实不会的考点”,粗心区指“看错题目、写错符号、漏了类型转换”,速度区指“会也能算对,但耗时太长”。给每一道错题贴上分类标签,比按题目顺序整理要有用得多。
具体做法是维护三张纠错表。第一张记录知识盲区,每行写“考点 + 错误答案 + 正确答案 + 一句话原因”。例如“浮点数比较:0.1+0.2==0.3 → False → 近似存储不精确”。第二张记录粗心区,考前只花 10 分钟重读这些题目,重点提醒自己“input 后要转类型”“sort() 返回 None”,这类错误靠提醒就能避免一大半。第三张记录速度区,标记出哪类题做得慢,通常是字符串格式化或列表推导式的长题干题,针对性做 5 道同类题提速。
6.1 频率优先的复习顺序
考前一周,按出现频率排序过一遍基础语法、循环和函数参数、字符串方法、文件读写、random 库这五个模块。二级题库里选择题的错误选项设计,很多都是把易混点故意放在一起,例如random.randrange(1, 6)和random.randint(1, 6)的边界,[::-1]与[::1]的方向。不必追求逐题刷完上千道题,而是把每个模块的高频题抽出来集中做掉,用正确率检验能漏点是否还在。
6.2 考前复盘的具体节奏
建议节奏是:第一天整体做一套题,按三张错题表分类;第二天只复习知识盲区,每一条盲区都要写出一个最小代码示例;第三天做一遍纯代码填空题,训练不看运行结果直接心算的能力;第四天回到错题表,把粗心区题目重做一遍,要求全对才放过;最后一天只扫盲区和速度区。通过这样的节奏,知识盲区会被压缩成极少数点,而不是撒在一整本题库里。
我自己备考最后一次二级时,把所以涉及可变对象共享的题目集中重做了一遍,从那以后见到默认参数为列表或字典的题,都会在动手前强制写一句“这个对象会变成共享吗?”再审题。这次 python二级复习梳理下来,最大的体检是:真正让你丢分的从来不是那些看起来很难的新题型,而是藏在常见语法里、你以为自己“早就明白”的细节。希望这份笔记能帮你把这样的细节提前筛出来,祝复习顺利。
本文还有配套的精品资源,点击获取