ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

18页Python面试题PDF:高效刷题避坑与高频考点拆解

18页Python面试题PDF:高效刷题避坑与高频考点拆解

简介:Python经典面试题集锦是一份精炼的面试备考文档,面向求职者、自学者及备考程序员,聚焦核心知识点与常见考题。压缩包内仅含1个PDF文件,大小390KB,便于离线阅读和打印。文档以问答形式系统地覆盖了Python开发中的高频考点,包括单例模式的两种实现方式(覆盖__new__方法和装饰器)、lambda匿名函数、property特性的原理与作用、staticmethod与classmethod的区别、内存管理机制、类型转换、列表去重、反序迭代序列、tuple与list转换,以及文件操作、随机数生成、邮件发送等实际问题。每个问题都配有简明解析或可运行的代码示例,有助于理解底层逻辑。此外还包含删除文件、复制文件、设置全局变量、正则匹配HTML标签等进阶题目,适合面试前集中突破基础薄弱环节。目前已有292人学习,通过系统练习这些题目,可以检验自己对面向对象、函数定义和数据结构操作的掌握程度,在实际编码中更加得心应手。

1. 一份 18 页的 Python 面试题 PDF,究竟在考什么

先说结论:如果你的目标是“看完这 18 页就能去面试”,大概率会翻车;但如果把它当成一张查漏补缺的考点地图,它的价值远超很多几百页的教程。Python 面试题看似五花八门,本质上是把“语言特性、内存模型、编码习惯、算法基础”四个维度反复翻炒。这份 PDF 能解决的是“我知道概念但说不清楚、写不出来”的尴尬——面试官最烦的就是候选人背了一堆名词,动笔却一片空白。

这类题集适合三类人:马上要面 Python 岗位的求职者、正在复习 Python 课程的在校生、需要快速给新人出一套摸底题的技术负责人。它不是源码包,也不是完整教程,而是一份“考前重点清单”。我一般会这么用:先不看答案,把每道题当笔试做一遍,再对照解析补漏,最后把错题拉出来单独复跑。18 页的题量并不大,但能把经典题吃透,比囫囵吞下几百道题有用得多。

2. 把 18 页题集变成备考方案:题量不大,怎么用才是关键

拿到任何一份面试题 PDF,第一件事不是打开就刷,而是先想清楚:它的题目是给“背诵”用的,还是给“自测”用的。经典面试题集锦这类资料,18 页的体量决定了它不可能覆盖全部 Python 知识,它更像一份经过筛选的“高频考点清单”。我的经验是:先定用途,再定刷法,最后才打开题目。

2.1 先分清“经典”“练习”“考试”三个词分别对应什么

标题里的“经典”指的是题目有代表性,常见于各厂面试和课程期末考;“练习”指的是这些题需要动手写,不是看解析就能会的;“考试”指的是需要限时、闭卷、模拟真实场景。三者对应三种完全不同的复习节奏:经典题用来建立框架,练习题用来训练手写能力,考试题用来检验水平。混为一谈是大多数人的第一个坑——拿着练习题当背诵材料,看完就忘。

用这套题集备考,我一般分三步走。第一步,花 20 分钟把整份 PDF 扫一遍,按考点分类,标出“会”和“不会”;第二步,从“不会”的题入手,每道题先自己写一版答案,写不出来再看解析;第三步,隔一天后,把所有题重新闭卷做一遍,看正确率是否过 80%。三步走完,这份 18 页的题集才算真正吃透了。

2.2 先看考点版图:一份能自测的 Python 面试知识清单

为了不盲目刷题,可以先把 Python 面试常考的知识点列成一张覆盖自测表。这张表不是 PDF 里原有的,而是这类题集背后默认的考察范围。你每做完一道题,就在对应模块打一个勾,最后看哪些模块是空缺的,那才是真正要补的地方。

模块典型考察点常考题型
基础语法与内置函数is与==、*args/**kwargs、zip/enumerate概念问答题
数据结构列表/元组/字典/集合特性、可变与不可变手写题 + 输出题
函数与作用域默认参数、闭包、变量作用域、nonlocal代码输出题
推导式与生成器列表推导式、生成器表达式、惰性求值手写题 + 内存分析
面向对象类变量与实例变量、__init__/__new__、继承中的super代码改错题
装饰器装饰器实现、带参数的装饰器、functools.wraps手写题
异常与上下文try/except/finally、with语句、自定义异常代码分析题
并发与 GIL线程/进程区别、GIL 的作用与局限、协程概念问答题
文件与 IO读写模式、上下文管理器、编码问题手写题 + 概念题
算法与数据结构反转字符串、去重、排序、斐波那契、链表手写题

拿到题集后第一件事,不是从头开始做题,而是先对照这张表统计每题归属,并另外记录高频考点,比如可变对象传参、装饰器执行顺序。这两个考点在各类题集中出现频率极高,值得优先判断是已经掌握还是只是眼熟。眼熟的题最危险——面试时说不出所以然,还不如诚实说不会。

2.3 按模块限时刷题:一套固定不变的三遍刷法

这里有一个常见争议:刷题到底要不要先看答案?我的建议是“先写、后看、再写”。第一遍完全不看解析,每道题给自己 15 分钟,写不出来的先空着;第二遍对照解析,用红笔标注“漏掉了什么”;第三遍不看任何资料,把标注过的题再写一遍。三遍下来,80% 的题可以形成长期记忆。

之所以三次重复,是为了区分“认识答案”和“能产出答案”。面试是产出型考察,不是识别型考察。识别型学习的典型表现是看到解析恍然大悟“哦对,是这样”,但关上 PDF 自己写就卡壳。产出型学习要求你从空白页开始,把代码敲出来或写在纸上。用题集备考最容易犯的错,就是把它当成睡前读物。

3. 经典 Python 面试题拆解:题目背后的考点比答案更重要

本章直接进入题目层面。下面这些题是我在多个面试题集、模拟项目里反复见到的经典题,也是 18 页 PDF 里最可能出现的一批。每道题拆成“题目、参考代码、考点说明”三部分,代码不是标准答案,而是能说清考点的最小实现。

3.1 可变与不可变:一道题带出函数传参和哈希三连问

题目:a = [1, 2, 3]; b = a; b.append(4)之后a是多少?如果a是元组呢?

# 列表是可变对象,b = a 只是复制了引用 a = [1, 2, 3] b = a b.append(4) print(a) # [1, 2, 3, 4] # 元组是不可变对象,没有 append 方法,会直接报 AttributeError c = (1, 2, 3) # c.append(4) # AttributeError: 'tuple' object has no attribute 'append'

这段代码考查两个层面:第一,b = a不是复制列表,而是让b指向和a同一块内存,所以修改b会反映到a上;第二,元组没有append,是因为不可变对象的所有修改操作都会被禁用,这是 Python 设计上的强制约束。面试官通常会顺着这个点继续追问:函数参数传递是值传递还是引用传递?答案是“对象引用传递”,不可变对象传进去后修改无效,可变对象传进去后修改会带上。

再往深一层,可变与不可变还决定了一个对象能不能做字典的键。字典键要求可哈希,列表是可变对象,所以list不能作为键;元组如果只包含不可变元素,就可以作为键。这类连环追问是面试题 PDF 里“经典”二字的真正含义——一道题只考一个点的不叫经典,能串起三个知识点的才算。

3.2 闭包与装饰器:高频手写题的标准骨架

题目:写一个装饰器,打印函数运行耗时。

import time import functools def timer(func): @functools.wraps(func) # 保留原函数的 __name__ 和 __doc__ def wrapper(*args, **kwargs): start = time.perf_counter() result = func(*args, **kwargs) cost = time.perf_counter() - start print(f"{func.__name__} 耗时 {cost:.4f} 秒") return result return wrapper @timer def slow_add(a, b): """返回 a 加 b 的结果""" time.sleep(0.1) return a + b print(slow_add(1, 2))

@functools.wraps(func)这一行是多数人容易漏掉的。不加它,装饰后函数的__name__会变成wrapper,日志和调试时很难定位。*args, **kwargs是为了让装饰器能适配任意参数签名,如果写死(a, b),遇到关键字参数就会报错。perf_counter比time.time精度更高,统计耗时通常用它而不是time.time。

面试官看到装饰器,通常会追加两个问题:装饰器执行时机是什么时候?答案是导入模块时立刻执行,不是调用函数时。再加一个追问:带参数的装饰器怎么写?要在外面再包一层函数,这要求你理解“函数返回函数”的层级关系。闭包和装饰器是 Python 面试题中少有的既考语法又考设计的题目,值得把标准骨架背熟。

3.3 生成器与推导式:考的是惰性求值,不是语法

题目:用一行代码生成 1 到 10 的平方列表,再用生成器表达式生成同样的序列,并说明两者的内存差异。

# 列表推导式:一次性算完,存进内存 squares_list = [x * x for x in range(1, 11)] print(squares_list) # 生成器表达式:惰性求值,边迭代边计算 squares_gen = (x * x for x in range(1, 11)) print(squares_gen) # <generator object ...> print(sum(squares_gen)) # 385,迭代一次后生成器耗尽

列表推导式返回的是真实的列表,长度 10,立刻占内存;生成器表达式返回的是一个生成器对象,它不保存全部结果,只在每次迭代时计算下一个值。sum(squares_gen)会把生成器完整迭代一遍,生成器在迭代完后被耗尽,再次list(squares_gen)得到的是空列表。这个行为在面试中经常以“输出题”出现,答案就是空列表。

题集里还有一类变体:生成器函数的yield与return混用。一个生成器函数里如果执行到return,会抛出StopIteration并终止迭代,return后面的值不会作为元素产出。用生成器做大数据量处理时,能明显降低内存占用,但代价是不能随机访问,只能顺序迭代。面试里能说清这两个取舍,就超过了大多数人,这也是面试题 PDF 里常把推导式和生成器放在同一页的原因。

3.4 手写算法最小集:反转、去重、排序、斐波那契

这类题不考奇技淫巧,考的是基础功底,而且面试时通常要求不用现成库函数手写逻辑。下面用反转字符串和斐波那契两个典型来落地。

# 反转字符串:双指针交换是面试官想看到的思路 def reverse_string(s: str) -> str: chars = list(s) # 字符串不可变,先转成列表 left, right = 0, len(chars) - 1 while left < right: chars[left], chars[right] = chars[right], chars[left] left += 1 right -= 1 return "".join(chars) # 斐波那契:迭代比递归更适合面试,避免重复计算 def fib(n: int) -> int: if n < 2: return n a, b = 0, 1 for _ in range(2, n + 1): a, b = b, a + b return b print(reverse_string("python")) # nohtyp print(fib(10)) # 55

反转字符串第一反应写s[::-1]确实是最短的解法,但面试官追问“不用切片怎么写”时,双指针交换才是他想听的。斐波那契用递归写出来很简洁,但n稍微大一点就会有大量重复计算,迭代版时间和空间都更优。手写算法题的通用套路是:先给最直观的解法,再主动说出它的复杂度问题,最后补一个优化版本。

4. 从练习题到能跑通的代码:一套可复现的刷题落地流程

只看不写,是练习 Python 题集最常见的高消耗低收益方式。章节标题里带“练习”二字,意味着 PDF 里的题目必须真正落到代码层面才算完成闭环。这章给出一个完整的落地流程,按步骤执行即可。

4.1 两小时模拟笔试:从选题到判分的完整流程

第一步是选题。从题集里挑 10 道题,其中 4 道概念问答题、6 道手写代码题,手写题里必须包含至少一道装饰器、一道数据结构操作、一道算法题。第二步是限时,总共 90 分钟,概念题每道不超过 8 分钟,手写题每道不超过 12 分钟。第三步是环境,关闭自动补全和代码提示,直接写在文本编辑器或白纸上,模拟真实笔试环境。

时间分配是大部分人的薄弱环节。常见做法是前松后紧,前面概念题写太满,后面算法题没时间。我的建议是:概念题每题控制在 5~6 分钟,手写题先用 2 分钟想清楚输入输出,再动手写。这套节奏适用于多种题集,不必局限于这一份 PDF。

4.2 判分标准:什么样的答案能拿高分

模拟笔试结束后,按以下维度给每题打分,每个维度 1 分,共 5 分:答案正确性、边界条件、代码风格、复杂度分析、口头表述。比如一道“反转字符串”的题目,能跑通得 1 分,考虑到空字符串和特殊字符得 1 分,变量命名清晰再得 1 分,主动说出时间复杂度和空间复杂度再得 1 分,最后能讲清“为什么不用s[::-1]”又得 1 分。

得分含义下一步行动
4~5 分可应对真实面试直接进入下一模块复习
2~3 分能写但讲不清对着镜子或录音复述一遍解题思路
0~1 分完全不会重看相关章节,隔天再做一遍

做完评分后把低分题对应到上一章的考点表,标记为“薄弱项”。这类题集的正确用法就是用来定位薄弱项的,而不是用来求“全部刷完”的心理满足。

4.3 把错题变成自测脚本:一份可复用的归档格式

刷题不归档等于白刷,我一般会把错题整理成结构化的题目存档,让它可以直接执行并作为自测脚本反复跑。下面是一个比较实用的归档方式:

# 目录结构:按模块归档,每题一个 .py 文件,方便单独运行 python_interview/ ├── 01_basic/ │ ├── is_vs_equal.py ├── 02_data_structure/ │ ├── list_reverse.py │ ├── dedup.py ├── 03_decorator/ │ ├── timer_decorator.py ├── run_all.py

写题时在文件头部用注释标明“题目来源、考点、第一次写的正确率、标准答案的复杂度和易错点”,方便快速定位并避开雷区。关键不是直接去网上下载现成题库,那个我做过的效果很差,而是把题集里做错的题录进来,形成自己的体系。文件头部注释里记一句“当时为什么错”,这才是错题归档里最有价值的资产。

5. 刷 Python 面试题集的 5 个避坑记录:现象、原因、对策

这套题集也好,网上的题集也好,刷题过程中踩过的坑基本集中在下面五类。每一条按“现象 → 原因 → 解决”的顺序来拆,方便你对照自己当前的复习状态。

5.1 背答案不背原理:追问两轮就露馅

现象:题目做对了,但面试官追问“为什么这里用is不用==”就卡壳,只能把背过的原话再重复一遍。原因:刷题时只看了解析的文字,没有自己推导内存模型和对象比较的逻辑。解决:做完每道题,在纸上画出变量的引用关系,用口头语言从头到尾讲一遍,讲到别人能听懂为止。

5.2 只看不写:考场上手写全变形

现象:看着题集觉得都会,模拟笔试时手写代码到处漏符号,def和return的缩进还能出错。原因:阅读代码和产出代码用的不是同一条神经通路,眼睛认识不代表手认识。

解决:所有题目一律先在无提示的编辑器或白纸上写,写完再对照标准答案,把差异逐行标注出来。代码题尤其不要看一行抄一行,那样基本无效。

5.3 默认参数与闭包延迟绑定:答案对但输出错的经典翻车

现象:一道“默认参数为列表”的题目,第一次写对了,换个问法又错了。题目:def f(x, lst=[]): lst.append(x); return lst,调用f(1)、f(2)、f(3)的结果是什么?答案是[1]、[1, 2]、[1, 2, 3]。原因:默认参数在函数定义时创建一次,之后每次调用复用同一个列表对象,这是 Python 的经典陷阱。

解决:默认参数改成None,在函数体内部再创建列表,分别是“一个坑”和“绕开坑”的标准写法。闭包延迟绑定同理,循环里用lambda i=i: i固定参数值,很多题解不写这个,面试时被追问就容易当场翻车。

5.4 无视版本差异:老题解在新解释器上跑不通

现象:有些题集里的解析还是 Python 2 风格,打印语句没括号,或者dict.keys()还在返回列表。原因:PDF 题集大概率是多年整理沉淀下来的,版本演化会导致部分解析过期。解决:做题前先确认运行环境,用python --version查看版本;看到不熟悉的写法,先跑一遍再判断,不要盲目背下来。

# 查看当前 Python 版本,决定题目解析是否适用 python --version

另外f-string是 3.6 才有的语法,typing模块在 3.5 之后才稳定,如果题集里出现的特性与本地版本不符,以官方文档为准。这类题集的价值在于考点框架,而不在于每个字都对。

5.5 题集解析不是标准答案:个别题目存在误人解析

现象:某道题按题集解析写,运行结果和解析不一致,反复查才发现是解析写错了。原因:人工整理的题集难免有笔误,尤其是“输出题”缺少运行验证。解决:每道题都自己跑一遍再收进错题本,不要在没验证的情况下背诵答案。有一道常见的try/except/finally输出题,不同题集给的答案都有差异,跑一次就知道是解析的问题,不是你的问题。

6. 进阶用法:用一份题集倒推自己的 Python 知识体系

刷完题只是开始,题集最大的价值在于帮你看清自己的盲区。这一步进阶做法是:对照错题,画一张属于自己的知识图谱,而不是停留在题集原本的目录顺序上。我在带新人的时候,常常让他把做错的题按“语法缺失、经验不足、思路不对”三类归档,语法缺失查文档补、经验不足靠练、思路不对找人讨论,最后再整理成一张树状图,就是完全可以自产的一份复习资料。

在此基础上可以继续扩展。一是把错题按“常考、易错、冷门”三个等级标注,面试前只复习前两类,冷门题只看不做,不耗时间。二是把高频考点转换成代码评审清单,比如“是否用了可变对象做默认参数”“是否在循环里定义了闭包函数”“装饰器是否加了functools.wraps”,这些在查队友代码时同样适用。三是隔一周重做一遍错题,确认是真的记住了,而不是暂时记住了。

我自己的教训是:第一遍刷题集时求快,一天刷完 18 页感觉良好,一周后重做正确率不到一半。后来改成少量多轮,每天只刷 6~8 题,每题都亲手验证,错题隔天复跑,一个月后反而能把题集里的大部分手写代码直接默写出来。慢才是快,尤其对职业考试类准备来说,重复质量比数量重要得多。希望这套刷法能帮到你,也祝你面试时遇到的每一道题,都在你自己的错题本里出现过。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进