简介:这份 Python 练习题库文档面向正在学习 Python 基础语法、准备课程测验或面试复习的初学者与进阶者,帮助读者通过填空与代码题快速检验对核心知识点的掌握程度。压缩包内共 1 个 docx 文件,约 165KB,内容以题目与参考答案对照的形式编排,覆盖标准库 math、None 空类型、列表元组字符串等有序序列、type() 与 id() 内置函数、列表重复与切片、map 与 zip 组合、列表推导式、字典 items() 方法、lambda 排序、转义字符、join 与 split 字符串操作等三十余个知识点。每道题后附有简短解析,便于读者理解答案背后的原理而非死记结论。目前已有 1008 人学习下载,适合作为日常刷题、考前自测与查漏补缺的轻量练习材料,也可供教学者参考出题思路。
1. 从一道填空题说起:Python 练习题到底在练什么
很多人第一次看到「Python 练习题-答案」这类资料,心里会犯嘀咕:不就是一堆填空和选择题吗,抄一遍答案不就完了?打个比方,这就像学游泳时岸上的分解动作练习——单看每个动作都简单,但它们是下水不呛水的前提。这份资料把 Python 的核心知识点拆成填空题、阅读程序题、程序填空题和编程题四类,覆盖 math 库、None 空类型、有序序列、type() 与 id()、列表推导式、切片、字典、lambda 排序、字符串方法等基础概念。它真正练的不是背答案,而是让你对「这行代码会输出什么」形成条件反射。搞懂它,你才算真正跨过了 Python 语法的第一道门槛。
2. 为什么这些填空题值得认真做:语法细节里的坑
2.1 填空题考的是「精确记忆」,不是理解力
先看几个典型题目。第一题问 math 库里算平方根的函数,答案是 sqrt;第二题问空类型,答案是 None;第四题问查看变量类型的函数,答案是 type()。这些题目看起来零碎,但它们共同指向一件事:Python 的很多行为是「约定俗成」的,你不记住具体名字,写代码时就只能靠猜。
打个比方,这就像记路名。你理解了城市的大致方位(理解力),但具体到「去某条街该拐哪个弯」,还是得记住路名(精确记忆)。填空题就是帮你把路名刻进脑子里。
再看第 8 题:已知 x = 3,id(x) 返回某个值,执行 x += 6 之后,id(x) 是否还等于原来的值?答案是 False。这道题考的是整数不可变、重新赋值会换内存地址这个底层事实。很多人第一次做会错,因为它反直觉——明明只是加了个 6,怎么地址就变了?这正是填空题的价值:它逼你面对那些「你以为你懂了但其实没懂」的细节。
2.2 阅读程序题练的是「人肉执行器」能力
资料里有一道题:k = 1000,while k > 1 循环里每次 k = k // 2,问循环执行几次。答案是 9 次。这种题不写代码也能做,但需要你在脑子里一步步推演:1000 → 500 → 250 → 125 → 62 → 31 → 15 → 7 → 3 → 1,数一数正好 9 次。
这种「人肉执行」的能力,是调试代码的基本功。真实开发中,你经常需要判断「这段循环到底跑了几次」「这个变量在第三轮时是什么值」。如果脑子里推不出来,就只能加 print 一行行看,效率差很多。
还有一道关于默认参数的题很经典:
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=[]只在函数定义时创建一次,之后所有调用共享同一个列表对象。这是个血泪坑,很多人在真实项目里被它坑过——你以为每次调用都是新列表,实际上它在悄悄累积。
提示:默认参数不要用可变对象(列表、字典),需要默认空列表时写成
old_list=None,函数体内再判断赋值。
2.3 程序填空题考的是「补全逻辑链」
程序填空题比纯填空更进一步:它给你一段有缺口的完整程序,让你补上关键的一两行。比如随机生成 50 个 1 到 20 的整数并统计频率,空缺处要填randint、50、0。这三个空分别对应「用什么函数生成随机整数」「生成多少个」「字典 get 的默认值」。
这类题训练的是「读需求 → 找缺口 → 填逻辑」的完整链路。它不像填空题那样只考一个知识点,而是要求你同时理解 random 库、列表推导式、字典计数三个概念,并且知道它们怎么串起来。通俗地说,填空题考的是「这个零件叫什么」,程序填空题考的是「这个零件装在哪」。
3. 易混概念辨析:那些看起来像但其实不一样的东西
3.1 易混点一:(3,)和(3)不是一回事
资料第 26、27 题专门考这个:x = (3,)执行后 x 是元组(3,),而x = (3)执行后 x 就是整数3。很多人第一次看到会愣住——括号不是元组的标志吗?
易混的原因在于:Python 里真正定义元组的是逗号,不是括号。括号只是用来分组的。(3)被解释为「一个带括号的整数 3」,而(3,)才是「只含一个元素的元组」。怎么区分?记住一句话:单元素元组必须有逗号,哪怕只有一个元素。
3.2 易混点二:max(x)和max(x, key=len)结果可能完全不同
资料第 23 到 25 题是一组绝佳对比。x =['11', '2', '3'],max(x)返回'3',因为字符串比较是按字符编码逐位比的,'3'的编码大于'1'和'2'。但max(x, key=len)返回'11',因为按长度比,'11'最长。
易混的原因在于:默认比较规则和指定 key 后的比较规则是两套逻辑。默认按「值本身」比,加了 key 就按「key 函数返回的值」比。怎么区分?看有没有 key 参数——有 key 就只看 key 的结果,原值只用来返回。
3.3 易混点三:sorted的 key 和 reverse 不是一回事
第 22 题:sorted([111, 2, 33], key=lambda x: -len(str(x)))返回[111, 33, 2]。这里 key 是「字符串长度的负数」,所以长度越长的排越前。而 reverse=True 是「把整个排序结果倒过来」,两者作用层面不同。
易混的原因在于:都能让「大的在前」,但 key 改变的是比较依据,reverse 改变的是输出顺序。怎么区分?问自己:我是想换一把尺子量(key),还是想把这把尺子量出来的结果倒着排(reverse)?
3.4 易混点四:id()相同不代表值永远不变
第 8 题已经点过:x = 3 时 id(x) 有某个值,x += 6 后 id 变了。但反过来,两个变量 id 相同,说明它们指向同一个对象。这里容易混的是「变量」和「对象」的关系——变量是标签,对象是盒子,id 是盒子的编号。给变量重新赋值,是换了个盒子贴标签,不是把原盒子里的东西改了。
怎么区分?记住:不可变对象(整数、字符串、元组)一旦「修改」就是新建对象;可变对象(列表、字典)原地修改时 id 不变。
3.5 易混点五:切片越界不报错,索引越界才报错
第 49 题:x = list(range(20)),print(x[100:200]) 输出[],不报错。但如果你写 x[100],就会 IndexError。易混的原因在于:切片是「取一段」,取不到就是空;索引是「取一个」,取不到就是错。怎么区分?看有没有冒号——有冒号就是切片,宽容;没冒号就是索引,严格。
4. 从练习题到真实代码:这些知识点什么时候用、什么时候别用
4.1 什么时候该用列表推导式和切片
列表推导式(如[i for i in range(100) if i % 13 == 0])适合「从一个序列生成另一个序列」的场景,代码短、意图清晰。但如果你在推导式里塞了多层嵌套加复杂条件,可读性会急剧下降,这时候老老实实写 for 循环反而更好。切片(如aList[3:7]、x[::2])适合取连续段或按步长跳取,但涉及「根据条件筛选」时,切片无能为力,得用推导式或 filter。
4.2 什么时候别用 lambda 硬凑
第 22 题用lambda x: -len(str(x))做排序 key,很巧妙。但真实项目里,如果排序逻辑超过一个简单表达式,就该写成具名函数。lambda 的优势是「一行能说清」,劣势是「超过一行就没人看得懂」。我见过有人把三层条件判断塞进 lambda,后来自己都读不明白,这就是典型的翻车现场。
4.3 一个具体判断表
| 场景 | 推荐做法 | 不推荐做法 |
|---|---|---|
| 生成规则简单的列表 | 列表推导式 | 手写 for + append |
| 取连续一段元素 | 切片 | 循环逐个取 |
| 排序依据复杂 | 具名函数作 key | 超长 lambda |
| 默认参数是空列表 | 用 None 占位 | 直接写=[] |
| 判断元素是否存在 | in运算符 | 手写循环对比 |
4.4 我踩过的那个坑
刚学 Python 那会儿,我做第 20 题(默认参数累积那个)时,看完答案觉得「哦,原来如此」,就翻篇了。结果两个月后写一个小工具,函数默认参数写了个空列表,跑第一遍正常,跑第二遍数据莫名其妙多出来一份,排查了半天才想起来这个知识点。从那以后我每次写函数默认参数,只要涉及列表或字典,都强制走一遍「是不是该用 None」的检查。这份练习题里的阅读程序题,恰恰就是把这些坑提前摆在你面前——你现在花十分钟看懂,将来就少花两小时 debug。
希望这份资料能帮你把 Python 的基础打得扎实一点,少走些弯路。
本文还有配套的精品资源,点击获取