2026/11/3 4:47:03

Python填空题高频陷阱:从id到默认参数的51道题解析

Python填空题高频陷阱:从id到默认参数的51道题解析 简介这份 Python 练习题库文档面向正在学习 Python 基础语法、准备课程测验或面试复习的初学者与进阶者帮助读者通过填空与代码题快速检验对核心知识点的掌握程度。内容围绕标准库 math、None 空类型、列表/元组/字符串等有序序列展开并覆盖 type() 与 id() 查看类型和内存地址、列表重复与切片、map 与 zip 组合、列表推导式、字典 items() 方法、lambda 排序、转义字符、join 与 split 字符串操作等三十余个典型考点每题均附参考答案与知识点说明便于对照自测与查漏补缺。资源包共 1 个 docx 文件约 165KB结构紧凑、即开即用适合打印或电子端刷题。目前已有 1008 人学习下载可作为日常练习与考前速览的轻量题库使用。1. 从一道“看着会、答不对”的填空题说起Python 练习题里最容易翻车的不是编程大题而是填空和读程序。比如x 3id(x)返回某个值执行x 6之后id(x) 原值是 True 还是 False很多人凭直觉写 True正确答案是 False。这一空考的不是语法记忆而是“整数不可变、赋值即重新绑定”这个底层模型。这份题库把填空、阅读程序、程序填空、编程四类题型按 51 道填空、25 道读程序、10 道补全、16 道编程铺开覆盖 math 库、None、有序序列、type/id、列表乘法、map、切片、推导式、zip 转字典、join、range、lambda 排序、字典 items、字符串 translate 等高频点。它适合已经写过一点 Python、但一遇到“输出结果是什么”就心里没底的人拿来逐题过一遍把会做和真懂之间的缝补上。2. 高频考点填空与表达式求值里的六个必考模型2.1 对象、类型与内存地址id 和 type 到底在问什么填空题前五道几乎年年以不同面目出现math.sqrt算平方根、None表示空类型、列表元组字符串都是有序序列、type()看类型、id()看内存地址。这五个点单独背不难难的是它们被串成一道题。典型问法是“已知x 3id(x)为某值执行x 6后id(x) 原值的结果”。答题思路是先判断类型整数是不可变对象不是原地修改而是算出新整数再让x指向它所以地址变了答案是 False。面试官最想听的是“不可变对象做增量赋值等于重新绑定”而不是“因为 3 加 6 等于 9”。同类还有x (3,)与x (3)的区别前者是单元素元组后者是整数 3逗号才是元组的标志。这类题错一次就该记一辈子因为考的就是“你知不知道语法糖背后的类型”。2.2 序列操作切片、负索引、乘法与 in 的边界切片是这份题库出现频率最高的家族。aList[3:7]取下标 3 到 6左闭右开list(range(6))[::2]得[0, 2, 4]x[100:200]越界不报错返回空列表[]x[len(x):] [1, 2]是在尾部追加。答题时先在心里画下标再套“左闭右开、越界容忍”两条规则基本不会错。负索引考的是-1是最后一个元素。[1, 2, 3] * 3得九个元素的重复列表注意它和[1, 2, 3] [1, 2, 3]结果一样但语义不同。[3] in [1, 2, 3, 4]为 False因为in判断的是“元素是否等于列表中的某一项”[3]是一个列表不是数字 3。这类题最容易凭眼熟写 True答题时强迫自己问一句“左边这个对象的类型和右边元素类型一致吗”。2.3 推导式、range 与 zip一行代码的生成逻辑列表推导式在填空和编程里都高频。生成 10 个 5 写[5 for i in range(10)]100 以内能被 13 整除写[i for i in range(100) if i % 13 0]筛选小于 3 写[x for x in [1,2,3,4,5] if x 3]得[1, 2]。答题模板是“先写表达式再写 for最后写 if”顺序不能反。range(1, 10, 3)得[1, 4, 7]步长是第三个参数。zip把两个列表按位置配对list(zip([1,2], [3,4]))得[(1, 3), (2, 4)]再套dict()就能把两个列表合成字典dict(zip(a, b))。这道题在填空第 13 题出现答题时要说清“zip 产生的是配对元组dict 消费这些元组建映射”两步缺一不可。2.4 字符串方法join、split、replace、find、format 的返回值字符串题量大但套路固定。.join(list(hello world!))原样还原:.join(abcdefg.split(cd))先按cd切成[ab, efg]再拼成ab:efg,.join(a b ccc\n\n\nddd .split())利用无参split()按任意空白切分并丢弃空串得a,b,ccc,ddd。find(python)区分大小写找不到返回-1不是报错也不是 None。%d,%c % (65, 65)得65,A%c把编码转字符。format题考位置参数The first:{1}, the second is {0}.format(65, 97)得The first:97, the second is 65花括号里的数字是参数下标不是顺序占位。replace(a, yy)全部替换abcab变yybcyyb。maketrans加translate是字符级映射abcw映射到xyzc注意w对应c别按字母表顺推。2.5 排序与 keymax、min、sorted 在字符串列表上的陷阱x [11, 2, 3]max(x)得3min(x)得11因为字符串比较逐字符看编码3的编码大于1。但max(x, keylen)得11因为按长度比11最长。sorted([111, 2, 33], keylambda x: -len(str(x)))得[111, 33, 2]先转字符串取长度负号表示长度降序。答题思路固定为三步确认比较对象、确认 key 返回什么、确认是否 reverse 或负号。面试里常追问“如果不加 key 会怎样”答“按元素本身比较字符串就按字典序数字就按数值”这一句能区分背答案和真理解。2.6 字典操作items、update、values 与 get 的默认值x {1: 2}执行x[2] 3后变{1: 2, 2: 3}新增键直接赋值即可。items()返回键值对视图sorted(x.items())按键排序。x.update({a: 3, d: 4})覆盖同名键、新增缺失键再sorted得[(a, 3), (b, 1), (d, 4)]。sorted({a:9, b:3, c:78}.values())得[3, 9, 78]只排值。统计频率的固定写法是r[i] r.get(i, 0) 1get的第二个参数是键不存在时的默认值。程序填空第 1 题就考这个填randint、50、0三空。答题时把“默认值 0 保证第一次出现从 1 开始计数”讲出来比只写答案更稳。3. 读程序题作用域、默认参数与循环控制的失分重灾区3.1 函数默认参数的可变对象陷阱读程序第 20 题是经典坑def demo(newitem, old_list[]): old_list.append(newitem) return old_list def main(): print(demo(a)) print(demo(b)) main()输出是[a]和[a, b]。原因在于默认参数old_list[]只在函数定义时求值一次之后每次调用共享同一个列表对象。答题时要明确说“默认值在 def 执行时绑定不是每次调用重新创建”。面试官最想听的是“可变默认参数要用 None 占位函数体内再初始化”这是从这道题能延伸出的工程习惯。同类还有第 19 题addInterest函数内balance newBalance只是局部重新绑定没有返回也没有改外部amount所以打印仍是 1000。答这类题先问“函数有没有 return、有没有原地修改可变对象”两个都没有外部变量就不变。3.2 参数传递位置、关键字、*args 与默认值覆盖第 3 题Sum(a8, c2)得 13因为b用默认 3Sum(8)得 16Sum(8, 2)得 15。第 23 题f(w3)打印3 2f(h7)打印1 7f(a3)直接报错因为没有名为a的参数。答题时把“关键字参数按名字匹配、未传的用默认值、名字不存在就 TypeError”三句话摆出来。第 21 题func5(1, 2, 3, 4, 5, 6)中a1、b2、c(3, 4, 5, 6)*c收集剩余位置参数为元组。第 22 题demo(*para)收到(1,2,3,4)平均 2.5大于平均的是 3 和 4返回(2.5, 3, 4)。这类题的关键是数清楚“固定参数吃掉几个剩下的才进 *args”。3.3 循环里的 break、else 与 enumerate 改列表第 6 题for i in range(1, 101): s i后面跟else: print(1)循环正常结束执行 else打印 1。第 7 题在i 50时breakelse 不执行打印累加到 50 的和 1275。for-else的规则是“没被 break 打断才走 else”答题时先找有没有 break再决定 else 走不走。第 8 题用enumerate遍历同时改x[index] 5把值为 3 的元素改成 5。这里考的是“遍历时拿到下标才能安全改列表”直接for value in x改 value 不影响原列表。第 16 题continue跳过偶数只打印奇数。第 17 题双层循环打印数字金字塔外层控制行、内层倒序打印答题时把range(i, 0, -1)的起止和步长讲清即可。3.4 字符串旋转、切片拼接与字典覆盖第 12 题foo(Happy New Year!)每次把首字符移到末尾输出appy New Year!H。第 11 题demo(lst, 4)返回lst[4:] lst[:4]得[5, 6, 1, 2, 3, 4]本质是左旋 4 位。第 13 题用两个列表按位置建字典l1中重复的 3 后出现覆盖前值最终3对应ff。第 14 题list2 list1[::]是浅拷贝改list1[0]不影响list2输出[3, 2] [1, 2]。这几道题共同考“切片产生新对象、赋值不共享”答题时点明“[::]是拷贝不是别名”比只报结果更有说服力。4. 易错点五类一考就露怯的题4.1 把in当成“子串包含”用在列表上错在哪看到[3] in [1, 2, 3, 4]就联想“3 在里面”写 True。为什么错in对列表是逐元素相等比较左边是列表[3]右边元素是整数类型不同直接 False。怎么答对先看左边对象类型列表查元素、字符串查子串两套规则不混用。4.2 默认参数用可变对象还以为是“每次新建”错在哪认为demo(a)和demo(b)各拿一个空列表。为什么错默认值在函数定义时求值一次之后共享。怎么答对答“可变默认参数会跨调用累积工程上改用 None 占位”既答对题又展示习惯。4.3 字符串比较按“数值大小”想当然错在哪max([11, 2, 3])写11。为什么错字符串逐字符比编码3首字符编码大于1。怎么答对先声明“这是字符串列表按字典序”再补“要按数值比得先转 int 或用 key”。4.4 切片越界以为会报 IndexError错在哪x[100:200]觉得会崩。为什么错切片对越界容忍返回能取到的部分全越界就是空列表。怎么答对区分“索引越界报错、切片越界不报错”一句话说清。4.5 函数内赋值以为改了外部变量错在哪addInterest里算了新余额就以为amount变了。为什么错函数内balance ...只是局部名字重新绑定不可变对象外部不受影响。怎么答对看有没有return、有没有对可变对象原地修改两者皆无则外部不变。5. 编程题答题套路从“能跑”到“考官想看的写法”5.1 文件、随机与列表原地操作的标准骨架编程第 1 题写文件标准写法是open(rD:\test.txt, a)加print(..., filefp)再close()。答题时把路径写成原始字符串避免转义模式说明白a追加可读。第 2 题偶数下标降序、奇数下标不变核心是切片赋值import random x [random.randint(0, 100) for i in range(20)] y x[::2] # 取出偶数下标元素 y.sort(reverseTrue) x[::2] y # 切片赋值写回原列表 print(x)x[::2]是步长 2 的切片x[::2] y要求等长这是“原地改列表”的考点。第 5 题前 10 升序后 10 降序同理分两段切片各自排序再写回。第 12 题删除奇数强调“从后往前删”因为pop(i)会让后面元素前移倒序遍历下标才不跳元素。5.2 判断类与数学类素数、闰年、分段函数素数函数的标准答法是试除到int(math.sqrt(v)) 1发现因子返回No循环走完走else返回Yes。闰年条件写x % 400 0 or (x % 4 0 and x % 100 ! 0)注意not x % 100 0和x % 100 ! 0等价但后者更易读。分段函数用if-elif按区间从低到高排边界写清楚0 x 5最后else兜底。这类题面试官看两点边界有没有漏、除零和开方有没有防护。答题时主动说“先处理非法输入再进主逻辑”比闷头写公式得分高。5.3 字符串与字典综合回文、凯撒、词频统计回文判断最简写法是s s[::-1]答题时补一句“切片倒序产生新字符串比较的是内容”。凯撒密码的核心是chr(ord(a) (ord(p) - ord(a) 3) % 26)先减基准再取模再加回大小写分开处理非字母原样输出。词频统计固定用char_counts[char] char_counts.get(char, 0) 1。第 8 题成绩字典找最高分同学用列表推导[name for name, score in scores.items() if score highest]答题时说明“先算 highest 再筛人避免在推导式里重复求最大值”。第 9 题补考名单用while循环持续询问strip()去空格再比较Y这些细节写出来就是区分度。5.4 程序填空的读题顺序补全题不要从第一空顺着填先通读代码猜功能再倒推每空职责。第 4 题质因数分解先看输出格式60 2 * 2 * 3 * 5确定要先打印x 循环条件x % k 0成立才除除不尽k 1。第 5 题哥德巴赫range(3, x//2, 2)只取奇数内层判断n1 % i 0就 breakelse分支说明 n1 是素数再令n2 x - n1验证。答题时把“为什么步长是 2、为什么到 x//2 停”讲出来补全题就从猜变成推。提示补全题里else挂在for还是if上直接决定逻辑对错读题时先对齐缩进再下笔。从那以后我每次做读程序题都强制先标出“哪些是可变对象、哪些是重新绑定、有没有 break”三步走完再写答案靠直觉填的错基本没再犯过。这份题库按填空、读程序、补全、编程四段排好答案就在题后拿来逐题过一遍、把错题按上面五类易错点归个档比刷零散题效率高得多。希望帮到你。本文还有配套的精品资源点击获取