Python期末考点全攻略:高频题型、易错陷阱与算法模板 简介面向 K12 阶段 Python 初学者的期末复习要点文档围绕输入输出、字符串、列表、排序算法、二分查找、函数与模块、异常处理和面向对象编程等高频考点整理成便于考前快速浏览的复习提纲。资源包共 1 个 docx 文件约 865KB内容按知识点分块呈现并配有可直接运行的代码示例已有 439 人学习下载。文档特别强调常见易错点例如 input().split() 与 map 的多数据输入写法、print 的 sep/end 控制、字符串排序去重与保序去重、sort 的 key/reverse 参数、列表 reverse 与切片逆序的内存区别以及 ifname main 的模块化用法同时给出桶排序统计频次、二分查找模板、lambda 自定义排序等可套用写法。末尾还整理了 Python 复习判断题式要点覆盖可变与不可变数据类型、深浅拷贝、列表 pop/del 等细节方便学生自测薄弱点也适合教师作为考前梳理参考。1. Python期末考点分布先弄清这门课到底考什么很多人复习 Python 期末习惯把课本从头翻到尾。结果一上考场看到0.4 - 0.1 0.3这道题第一反应填 True直接丢分。这不是基础差是没摸清这门考试的出题脾气。Python 期末的高频考点其实很集中输入输出、字符串处理、列表排序去重、桶排序和二分查找几个算法模板再加上一组专门挖坑的概念题——比如x.sort()返回 None、sqrt(4)的结果是 2.0、A(3)不是元组。把这些点逐个击破比盲目刷题高效得多。这篇备考笔记面向正在复习 python 期末的 K12 学习者按考点分布、高频题型、易错陷阱、答题策略四层拆开让你在期末考场上少丢不该丢的分。2. 输入输出与字符串必考模板与print参数拆解输入输出几乎是所有 Python 期末试卷的第一道大题。这部分的考察不是背语法而是给定输入格式让你写读入和输出的代码。很多翻车现场都出在split()和map()的组合使用上。只要把下面三种连续输入的模式吃透这类题基本就是送分。2.1 input().split() 与 map()连续输入的套路先看最常见的读入模式a, b, c map(int, input().split())这行代码干了三件事input()读入一整行字符串.split()按默认空白空格、制表符、换行把字符串切成若干段map(int, ...)把每一段转换成整数然后分别赋给 a、b、c。注意这里必须写成input().split()括号不能省不少考生抄笔记时写成input.split()运行时直接报错。A input().split() # 返回字符串列表如 [12, 34, 56] a, b input().split() # 两个变量各接收一个字符串当一个变量接收时得到的是一个字符串列表当多个变量接收时每个变量拿到一个字符串。这个区别经常考察执行后变量类型是什么。如果题目要求接收的是整数就必须套map(int, ...)或逐个int()转换否则后面做加法会拼成字符串而不是数值相加。提示split()括号里可以指定分隔符比如input().split(,)表示按逗号分割。默认分隔符是任意空白字符这是大多数题目默认的输入形式。2.2 print() 参数拆解sep、end、file、flushprint()的完整签名在期末中高频出现尤其是判断输出结果类的题目print(*objects, sep , end\n, filesys.stdout, flushFalse)objects一次可以输出多个值逗号隔开sep多个值之间的分隔符默认一个空格end输出结尾字符默认换行file输出流向默认标准输出 sys.stdoutflush是否立即刷新缓冲区默认 Falseprint(1, 2, 3, sep,, end!)输出的是1,2,3!。期末题常让你判断输出结果或者让你用sep去掉空格、用end不换行。这个表格建议考前背一遍参数默认值作用常考场景sep空格多个输出对象之间的分隔符sep, 拼接输出end换行输出末尾追加的字符end 实现不换行filesys.stdout输出目标概念判断题flushFalse是否清空缓冲区概念判断题最容易被绕进去的是sep和end的分工sep管的是两个输出值之间end管的是整条输出结束时。题目里如果把sep,和end!混着出先写清楚数据再套参数基本不会错。2.3 字符串排序去重与 join() 拼回字符串去重排序是期末的经典输出题模板如下s input() # 读取字符串 s1 list(set(s)) # set 去重list 转成列表 s1.sort() # 按 ASCII 码排序 print(.join(s1)) # 用空字符串拼接还原成字符串输出set(s)会去掉重复字符但集合本身无序所以必须紧接着sort()按字符编码排序最后再用.join(s1)把列表拼回字符串。很多人直接输出set转出来的列表结果带引号和逗号格式分白丢。注意.join()括号里只能放由字符串组成的列表如果列表里有数字需要先str()转换。真题练习输入一行小写字母去掉重复字符后按字典序输出。输入bdacdab输出abcd。答题思路第一步确定数据流——读入字符串 slist(set(s))得到去重后的字符列表排序后用.join输出。模板默写出来不要现场想。如果需要保持原字符串中首次出现的顺序set就不适用要改成sorted(set(s), keys.index)这时key会按每个字符第一次出现的位置编号排序。字符串本身是不可变类型所有对字符串的修改都会产生新对象。如果题目要求从字符串中删除某些字符.join(x.split())是常见技巧——先用split(a)按指定分隔符切开再用空串拼回去就相当于删除了这些分隔符。类似地strip()删除字符串左右两端的指定字符lstrip()、rstrip()分别删除左端、右端默认都处理空白字符。3. 列表排序与去重三条主线和三种逆序写法列表在期末试卷里的出镜率最高而且通常是组合题读入列表、去重、排序、输出一步接一步。这章把三条主线串起来去重保序、原地排序与返回新列表的区分、以及自定义 key 排序。最后再单独对比逆序的三种写法。3.1 列表去重保序set 配合 index 的经典写法s1 input().split(,) # 按逗号分割读入得到字符串列表 s2 list(set(s1)) # set 去重但顺序会被打乱 print(sorted(s2, keys1.index)) # 按原列表首次出现顺序排序后输出list(set(s1))只负责去重不保证顺序。要让去重后的元素按它们第一次出现的位置排序就让keys1.index。s1.index(x)返回 x 在原始列表中的下标sorted会把它当作排序依据顺序就恢复了。数据量小时这个写法简单够用如果数据量大index是 O(n) 查找整体偏慢更稳的做法循环遍历手动去重。摘要里提到的list(dict.fromkeys(s1))是另一个保序去重方案。dict.fromkeys用列表元素作键创建字典后续重复的键会被保留第一次的位置再转回列表就是保序去重需要在一行内解决时非常好用。它依赖字典的插入顺序特性期末选择题如果考哪个写法能保序去重选这个通常没错。3.2 sort() 与 sorted()谁改谁不改这是期末最高频的考点之一而且必带一个坑。看代码x [5, 1, 3] print(x.sort()) # Nonesort 是原地排序没有返回值 print(x) # [1, 3, 5]x 已经被修改 y [5, 1, 3] print(sorted(y)) # [1, 3, 5]返回新列表 print(y) # [5, 1, 3]原列表没变sort()是列表的原地方法直接修改原列表返回值是 Nonesorted()是内置函数返回一个排好序的新列表原列表不动。考试里最容易手滑写成x x.sort()这一写 x 就变成 None 了后续所有操作全崩。正确做法是单独一行x.sort()之后再使用 x。另一个注意点是x.reverse()同样是原地操作返回值也是 None。真题里出现过以下代码输出什么的题型先x.sort()再print(x)输出排序后的列表但如果直接print(x.sort())输出的就是 None。做题时先想清这个操作改不改原列表、返回什么值再决定怎么写。3.3 自定义 key 排序数位排序的实战拆解自定义排序是期末的压轴题风格之一最典型的例子是按各位数字之和排序。题目通常给出 n 和 m要求把 1 到 n 的数字按各位数字之和从小到大排再输出第 m 个数。n int(input()) m int(input()) s list(range(1, n 1)) # 生成 1 到 n 的列表 s.sort(keylambda x: sum(int(i) for i in str(x))) # 按各位数字之和排序 print(s[m - 1]) # 输出第 m 个下标记得减 1key参数接收一个函数这个函数对列表里每个元素算出一个排序键。lambda x: sum(int(i) for i in str(x))先把数字 x 转成字符串逐位取字符再转回整数求和得到各位数字之和。sort会按照这个键从小到大排列而每个元素本身仍然保留原值。整个过程没有显式交换任何元素这就是 key 定制排序的意义。这种题的答题思路是三步构造列表、写 key 函数、索引输出。考试时如果记不住 lambda 怎么写可以先写一个普通函数再传给 key效果一样。容易漏掉的是s[m - 1]的下标偏移——题目说第 m 个索引要从 0 开始所以必须减 1。3.4 逆序输出的三种写法与内存视角逆序输出是送分题但送分也分三档。先看代码a [3, 1, 2] a.sort(reverseTrue) # 降序原地排序原列表被改 print(a) # [3, 2, 1] b [3, 1, 2] b.reverse() # 反转位置原地操作原列表被改 print(b) # [2, 1, 3] c [3, 1, 2] print(c[::-1]) # 切片反转返回新列表原列表不变 print(c) # [3, 1, 2]三种写法的差异集中在是否改原列表和是否复制内存写法是否改原列表返回值内存说明list.sort(reverseTrue)改None不额外复制列表list.reverse()改None不额外复制列表list[::-1]不改新列表复制一份全部元素考试题如果要求不改变原列表输出逆序用print(c[::-1])如果要求原地逆序用c.reverse()如果题目给了排序和逆序两个要求就在sort(reverseTrue)上做文章。切片反转虽然直观但它是新建副本列表大时内存翻倍这也是一个潜在的扣分理由。4. 算法专题桶排序与二分查找的考场写法期末程序题里出现频率最高的两个算法模板一个是桶排序统计频次一个是二分查找。它们不算难但细节决定能否满分尤其是二分查找的边界条件。这章把两个模板拆成可以直接默写的代码块再补上输出格式的踩点。4.1 桶排序的字典计数模板题目通常这样出读入一个整数 n 和 n 个自然数统计每个自然数出现多少次按自然数从小到大输出每行一个数 次数。n int(input()) num_list list(map(int, input().split())) # 读入一串自然数 count_dict {} # 用字典作桶 for num in num_list: count_dict[num] count_dict.get(num, 0) 1 # 计数惯用法 sorted_nums sorted(count_dict.keys()) # 按键从小到大 for num in sorted_nums: if count_dict[num] 0: print(num, count_dict[num]) # 输出自然数和出现次数核心是count_dict.get(num, 0) 1。get在键不存在时返回默认值 0所以第一次遇到某个数时计数从 1 开始之后每遇到一次加 1。最后sorted(count_dict.keys())按自然数从小到大遍历把每个数和出现次数以数 次数格式输出。这里字典的键就是桶键是自然数值是出现次数构成了桶排序的基本形态。实际写题时需要注意题目如果没有要求按顺序输出有些人会直接遍历count_dict但字典的遍历顺序不一定等差有序。记住一个原则——输出前先想清楚输出顺序由谁决定需要有序就sorted省得白丢格式分。另外n这个变量虽然在示例里读入了但后续统计靠的是num_list不要被输入格式干扰。4.2 二分查找的边界与返回值典型的期末程序题读入一串数排序后查找目标值的下标查到返回下标查不到返回 -1。输入第一行是列表长度第二行是列表元素第三行是要找的目标值。def find(nums, target): left, right 0, len(nums) - 1 while left right: # 边界条件决定是否漏判 mid (left right) // 2 # 取中间下标 if nums[mid] target: return mid elif nums[mid] target: left mid 1 # 目标在右半边 else: right mid - 1 # 目标在左半边 return -1 a list(map(int, input().split())) a.sort() # 二分前提必须先排序 target int(input()) print(find(a, target))二分查找有两个必须讲清的细节。第一条件是left right还是left right如果写成left right当区间里只剩一个元素时循环就停了此刻这个元素还没被检查极容易漏判比如列表只有一个数且就是要找的目标返回的却是 -1。所以期末想稳就统一用left right。第二mid (left right) // 2用整除取中间下标当nums[mid] target时说明目标在右半边left mid 1反之right mid - 1这一步的目的是排除已经检查过的 mid。最后循环还没找到就返回 -1。提示先排序再二分。find内部假设nums是非降序的。如果题目输入自带顺序但不能保证先nums.sort()再做二分这一行往往就是满分和零分的差距。4.3 两个题型的输出格式踩点桶排序的输出样例通常是2 1 3 2 5 1每行一个数加一个空格加出现次数正好对应print(num, count_dict[num])默认用空格分隔、换行结尾。二分查找的输出则只有一个数下标或 -1。这两类输出都不要再额外拼空格或换行print的参数格式本身就是最稳的——多加了空格反而会判输出错误。程序题的最后检查建议按顺序看三处输入格式和split()的分隔符是否一致原列表有没有排序二分或输出前有没有排序桶排序输出格式和样例是否逐字符一致。这三处检查完算法题基本不会失分。5. 易错点期末高频失分陷阱清单这一章把所有期末试卷里反复出现的坑集中列出来。每一条都按错在哪 → 为什么错 → 怎么答对来讲考前最后一天就看这份清单。概念题的失分往往不是不会而是踩了这些预设的陷阱。5.1 类型与比较的陷阱第一坑A (3)被当成元组。错在以为加圆括号就是元组。(3)里的圆括号只是数学运算的优先级符号所以type(A)是整数要定义单元素元组必须加逗号A (3,)。判断方式很简单看逗号不看括号。第二坑0.4 - 0.1 0.3填 True。错在对浮点数精度没有概念。0.4、0.1 在二进制里都是无限循环小数存储时被截断算出来的结果只能接近 0.3不能完全相等。正确的接近判断用math.isclose(0.4 - 0.1, 0.3)。第三坑拿复数比大小。复数只有相等和不等两个判断没有大于小于。概念题里出现过复数之间可以比较大小的选项直接判错。同理元组之间的比较是从左到右逐个元素比较元素类型不同就无法比较。A (3) print(type(A)) # class int不是元组 A (3,) print(type(A)) # class tuple import math print(0.4 - 0.1 0.3) # False浮点数精度问题 print(math.isclose(0.4 - 0.1, 0.3)) # True还有一个高频概念可变与不可变类型。可变数据类型是列表、字典、集合不可变数据类型是数值、字符串、元组。期末判断元组是否可变这类题答案一定是元组不可变。又因为字典的键必须不可变列表不能作为键字符串和元组可以——这个点常借哈希的名义一起考。5.2 拷贝与原地操作的陷阱第一坑x x.sort()直接把数据弄丢。错在不知道sort()是原地操作、返回值是 None。赋值之后x 的实际值变成 None后面不管怎么用都是错的。正确写法是x.sort()之后再用 x。同理还有x.reverse()。第二坑y x之后改 yx 也变了。错在把赋值当成复制。y x只是让 y 和 x 指向同一个列表对象id 相同任意一边修改都会互相影响。要复制内容用y x[:]或y x.copy()这时得到浅拷贝新列表独立存在。注意切片拷贝只拷贝最外层嵌套列表里的子列表仍然是共享的这个可以当额外考点记。第三坑想用del删除集合中的部分元素。集合不支持下标访问也就不能像列表那样按位置删除。del可以删除整个集合或者用remove(x)删除指定元素。判断题如果出del 可以删除集合中任意一个元素答案是错的。x [3, 1, 2] print(x.sort()) # Nonesort 返回值是 None x [3, 1, 2] y x # 赋值y 和 x 指向同一个列表 y.append(4) print(x) # [3, 1, 2, 4]x 也被改了 s {1, 2, 3} # del s[0] # 报错集合不支持下标删除 s.remove(2) print(s) # {1, 3}5.3 字符串、进制与内置函数的陷阱第一坑int(123, 16)到底等于多少。这个函数是把十六进制表示下的字符串 123转换成十进制数值。按位权展开1*16^2 2*16 3*16^0 256 32 3 291。很多人算成 123 或 123都是没搞懂进制转换是位权求和。进制参数必须在 2 到 36 之间且每位数字必须小于进制数否则会报错。第二坑strip()以为只去空格。实际上strip()默认删除字符串左右两端的空白字符包括空格、制表符、换行。想删指定字符可以传参数比如s.strip(a)只删首尾的字母 a。如果不了解默认行为容易在判断空白字符串时翻车。第三坑split()和join()的方向搞反。字符串以某字符分割后返回的是列表列表以某字符拼接返回的是字符串方向恰好相反。期末的格式判断题最爱考这一对答案总是分割出列表、拼接收回字符串。print(int(123, 16)) # 291十六进制转十进制 s python print(s.strip()) # python去掉首尾空白 print(s.lstrip()) # python 只去左边 print(s.rstrip()) # python只去右边 print(a,b,c.split(,)) # [a, b, c] print(-.join([a, b])) # a-b第四坑忘记if __name__ __main__:的作用。这一行是为了保证代码的可重用性被当作模块导入时模块内的这段代码不会执行只有直接运行当前脚本时才执行。判断题选项里出现防止循环导入保证代码不被执行之类的描述都是错的正确说法是保证代码可重用。6. 应试策略答题顺序与一套自检清单期末程序题的丢分往往不是不会而是顺序乱了。拿到卷子先做两件事快速扫一遍题目把概念判断题和写代码题分开写代码题又按先背模板再改参数的顺序推进。比如读到输入输出格式直接先默写input().split()或map(int, input().split())别在草稿纸上推演语法。代码写完不要立刻看下一题先过一遍必查清单。第一输入部分有没有写成input.split()少了括号的调用会导致运行直接报错。第二split()的分隔符跟题目给的输入格式是否是同一个一个逗号和空格的区别会让后半段全部白写。第三有没有该排序没排序。二分查找的前提是有序序列桶排序输出要按自然数顺序这两处是最容易被判零的原因。第四输出格式跟样例对照一遍多了空格或者少了换行在小分题上很吃亏。第五凡是涉及原地操作的sort()、reverse()绝不能用它的返回值继续参与计算。我自己备考的时候养成了一个很笨但有效的习惯每写完一段代码强制自己在脑子里跑一个最小输入样例三四个数就够。比如二分查找就单独测一个长度为 1 的列表去重排序就测一个全是重复字符的字符串这个概念题就测A(3)的type输出。这个习惯救过我太多次从那以后我每次交卷前都强制自己走一遍这个流程。期末不像竞赛它考的就是稳少丢一个格式分都是赚到的。希望帮到你。本文还有配套的精品资源点击获取