简介:面向Python技术面试者的基础知识整理包,覆盖编程语法、数据结构、算法、面向对象编程、异常处理、标准库、文件操作、网络编程、数据库操作与项目实践十个核心模块。内容从变量赋值、数据类型、流程控制等基础语法,到列表推导式、字典键值操作、栈与队列实现,再到常见排序与查找算法、递归和动态规划,同时包含类与继承、封装多态、try-except异常捕获、os/sys/json/re等标准库用法,并给出了socket通信、sqlite3操作SQLite数据库的实践示例。资源以zip压缩包形式提供,大小33.16MB,已有508人学习下载,适合准备技术面试的Python初中级开发者,也可作为日常复习的速查手册。资料按知识点分模块组织,便于按需查阅,同时关注Python版本更新特性,能帮助读者系统梳理高频考点,为项目编码和手写代码环节打下坚实基础。
1. Python面试基础知识是什么:新手的第一张地图
很多朋友刚接触“Python开发”相关的学习资料,第一眼就看到“技术面试”四个字,心里立刻发怵:我连一行代码都还没写过,面试是不是离我太远了?其实技术面试考的不是什么高深框架,而是一套很固定的基础:数据类型、分支循环、函数、面向对象、异常处理。这些名词看着唬人,拆开看,每一个都像搭积木一样简单。这份整理就是把零基础入门要掌握的 Python 知识,按面试考点串成了一条线,适合完全没写过代码的人,也适合看了几节课却不知道怎么验证自己学没学会的人。读完你会清楚先学哪块、怎么练、踩坑以后去哪查,然后照着顺序往下走就行。
2. 为什么面试总要考这些基础:先看懂出题人想要什么
2.1 面试官想确认的不是你背得多,而是你脑子里有没有运行画面
零基础备考最容易踩的第一个坑,就是用背题代替理解。有人听说面试考 Python 基础,连夜收集了一堆“必问 100 题”开始背。背了三天,题目里的数字变一下、条件的顺序换一下,整个人就卡住了。这种感受通常不是因为不够努力,而是基础知识还没有形成“画面”。
我说的画面,是指你看到一段代码时,能凭脑子模拟出它的执行过程:变量现在存了什么值、for 循环一共转了几圈、列表里此刻有几个元素、函数调用之后返回值到底去了哪里。技术面试考基础,本质上就是在验证这个画面存不存在。同样是“列表去重”这种小学难度的题,有人用 for 循环手动判断,有人转成 set 再转回来,有人用字典保持原有顺序。写法没有绝对的对错,关键在于是不是能解释清楚自己为什么这样写。能解释清楚,基础就是扎实的;解释不清楚,说明只是记住了答案,换一道题就露馅。
所以你会发现,真正的技术面试很少直接问“什么是列表”,而是通过不同类型的小题,侧面测试你对数据类型、运算规则、作用域规则的熟练程度。理解了这一点,复习方向自然就变了:不再追求“把答案背完”,而是追求“每个知识点都能举一个自己讲得明白的小例子”。
2.2 Python 基础在面试里的四种出场方式
既然基础要通过题目来考,零基础至少要认识题目长什么样。概括起来,它们有四种常见形态。
第一种是选择题。这类题最爱考类型和比较。比如“is”和“==”到底有什么区别,字符串“123”和整数 123 能不能直接相加,一个变量先后被赋值为整数和字符串会发生什么。选项往往长得像双胞胎,基础不牢的人基本靠猜。这里有个很典型的送分陷阱:print(range(1, 4))并不会打印出 1、2、3,它打印的是一个 range 对象,想看到数字得用 list 转换或者 for 循环。这类细节,光看书很难记住,上手敲一遍就忘不掉。
第二种是手写小代码。常在笔试或机试环节出现:字符串反转、列表合并去重、统计一段文字里每个字符出现的次数。这类题代码量不大,一般十几行之内能写完,考的是对控制流和数据结构的熟练度,不涉及复杂算法。零基础准备要特别注意:这类题拼的是手速和熟练度,不是灵光一现,所以基础语法要练到不用翻书也能默写出来。
第三种是口头问答。面试官抛出一个概念词,让对方用几句话解释清楚。常被问的词有:浅拷贝和深拷贝的区别、闭包是什么、为什么函数默认参数不要用可变对象、try-except 的完整执行顺序。这种题难在人容易越讲越绕,能讲得通俗,才说明是真懂,而不是背定义。
第四种是读代码判断题。给你一段现成的代码,让你说出运行输出或者找出 bug。这种题最考验那个“运行画面”,因为它不能运行,只能脑内模拟。平时高度依赖编辑器看结果的人,一开始会被这种题难住,但练多了自然就适应。给你一个最简单的例子:for i in range(3): print(i),输出是 0 1 2 而不是 1 2 3,这就是从 0 开始的下标习惯在作怪。把一个知识点练到这种一眼能看穿的程度,读代码题就不慌了。
四种形态看下来有一个共同点:全部围绕基础概念本身,不涉及某个框架或复杂项目。所以零基础的方向非常清晰——先把基础吃透,再谈刷题。
2.3 零基础复习的基础顺序:先过一遍,再深挖重点,最后用题目自查
备考路上常见两个极端:一个是“先把所有语法学完再动手”,结果拖了两周还没写过完整程序;另一个是“直接冲题海”,结果每道题都半懂不懂,错了也不知道错在哪。比较省力的顺序可以分成四轮。
第一轮通读。用一两天把基础语法整条扫一遍,不求立刻记住,只求混个脸熟。变量、列表、if、for、def、class,你要知道这些名词存在,也知道以后去哪一章翻。
第二轮主攻数据结构和控制流。字符串、列表、字典、元组,加上 if、for、while。这一轮是手写代码题的主战场,值得投入最多时间,一定要多敲多改。
第三轮啃函数与面向对象。理解参数怎么传、返回值怎么用、对象怎么创建、类怎么继承。这一阶段需要反复看运行结果,让“运行画面”逐渐成型。
第四轮回到面试题。挑三五道代表性题目做一遍,做完先别急着看答案,自己解释一遍每行代码在干什么,再对照错题回头翻基础。这样一轮下来,基础题基本可以招架住。
这个顺序恰好也是这份整理的排版顺序:从数据类型开始,一路走到函数、面向对象、异常处理和易错点。你不需要自己排列组合,照着过一遍就行。
3. 第一段能跑的代码:从数据类型和控制流开始
3.1 变量与数据类型:先给数据贴上名字
任何语言入门,第一件事都是理解变量。变量可以理解为给数据起一个名字,数据本身是内容,变量是贴在数据外面的标签。比如name = "Python",就是把字符串“Python”这份数据存起来,以后想用它就喊 name。表面上看很简单,零基础真正容易搞反的是方向:变量存的是数据,不是名字。你操作变量,本质上就是在操作它代表的那份数据。
Python 是动态类型语言,变量不需要预先声明类型,今天放整数,明天放字符串都不限制。这种灵活是好事,但也催生了一批面试选择题:经常有人把“1”和 1 搞混。前者是字符串,后者是整数,两个数据在内存里的存储方式完全不同,直接相加会报错。想分清类型,最直接的办法是用type()函数:
print(type(1)) # 输出 <class 'int'> print(type("1")) # 输出 <class 'str'> print(type(3.14)) # 输出 <class 'float'> print(type(True)) # 输出 <class 'bool'>print 是 Python 里最常用的输出函数,type 返回数据对应的类型。初学阶段遇到不确定类型的变量,就打印一下它的类型,比翻书快得多,这个习惯能帮你减少很多自我怀疑。四个基础类型在面试里出现频率最高,先混个脸熟:
| 类型 | 写法示例 | 常见场景 |
|---|---|---|
| 整数 int | 1、-5、100 | 计数、循环控制 |
| 浮点数 float | 3.14、0.5 | 除法结果、坐标计算 |
| 字符串 str | "hello"、'python' | 文本内容 |
| 布尔值 bool | True、False | 条件判断结果 |
这四个类型记住了,基本可以开始写代码。至于更复杂的列表和字典,单独放一节说,因为它们太常考了。
3.2 列表和字典:两道高频大题的主角
如果只能挑两个数据结构重点学,我会投给列表和字典。列表像一排有序的格子,格子里可以放任意数据,可以同时放整数、字符串,甚至放另一个列表。取值用下标,items[0] 表示取第一个元素,下标从 0 开始而不是从 1 开始。这个设计坑过不少新手:取到最后一个元素还容易写错,比如 range 出来的数字想要对应下标,常常差一个。解决办法是先用 len(items) 拿到长度,再用 len(items)-1 作为最后一个元素的下标。
字典像一本小词典,存的是“键值对”,用信息本身查值:{"name": "小猫", "age": 2},想查名字直接data["name"]。字典特别适合描述一个实体的多个属性:一个用户有昵称、年龄、注册时间,用字典比用一堆变量清爽太多。这里先落下一个小例子,跟着感受一下:
data = {"name": "小猫", "age": 2} # 字典:键是name和age,值是具体内容 print(data["name"]) # 通过键取回值,输出“小猫” data["color"] = "白色" # 新增一个键值对,不影响其他数据字典的取值和新增都靠键完成,键在字典里是唯一存在的。如果你试着用不存在的键去取值,比如 data["weight"],程序直接报 KeyError。这也顺带解释了面试里的一个考点:为什么字典的键必须是不可变类型?因为键要“稳定”,才能可靠地被查找。
面试里常把列表和字典组合出题,最典型的一道就是“统计字符出现次数”:遍历文字,遇到一个字符,就拿它当键去字典里查现在出现了几次,然后加一写回去。这一题只要亲手写一遍,列表遍历和字典操作两项基本功就都练到了。
3.3 分支与循环:让程序学会自己判断和重复
变量和数据都认识了,现在把它们串起来,跑第一段真正完整的代码。场景很简单:有一组数字,把偶数和奇数分到两个列表里。代码不到十五行,但覆盖了变量、列表、for、if、print 五个核心知识点。
numbers = [1, 2, 3, 4, 5, 6] # 待分类的一组数 even = [] # 用来收集偶数 odd = [] # 用来收集奇数 for n in numbers: # 逐个取出列表里的数字,每次叫n if n % 2 == 0: # 能被2整除,说明是偶数 even.append(n) # 把n放进even列表 else: odd.append(n) # 剩下的放进odd print("偶数:", even) # 输出偶数列表 print("奇数:", odd) # 输出奇数列表先别管每一行是不是完全看得懂,跟着敲进编辑器里运行一次,看到输出长什么样。然后再把 numbers 里的数字改几个,比如加一个 0、改一个 7,重新运行。这是找回手感的第一步。
逐行拆开就更清楚了。for n in numbers 的意思是:把列表 numbers 里的元素挨个取出来,每轮一个,依次赋值给变量 n。第一次循环完了 n 是 1,第二次 n 是 2,直到把整个列表取完。if n % 2 == 0 中的 % 是取余数运算符,任何整数除以 2 的余数如果是 0,就是偶数;否则落到 else 分支进奇数列表。even.append(n) 调用列表自带的 append 方法,把当前 n 追加到列表末尾。这里值得注意的方法是“对象.方法名()”的写法,后面学面向对象会不断见到。
跑通以后,把这个例子稍微变形,就是一道真实面试题的雏形。如果把 numbers 换成一句英文文本,把判断逻辑从“奇偶判断”改成“统计字符次数”,用字典来存结果,就变成了我们在 3.2 提到的那道经典题。你能在这个基础上改通字典版本,数据类型和控制流这一关就算真正过关了。
提示:这段代码里的
print("偶数:", even)会自动在偶数两个字后面加一个空格再输出列表,这是 print 多个参数时的默认行为。
4. 第二道坎:函数、面向对象和异常处理
4.1 函数:把重复动作装进工具盒
到函数这里,代码不再是一口气写到底的平铺直叙,开始进入“造工具”的阶段。函数就像厨房里的一把刀:定义一次,反复使用。定义函数的关键词是 def,后面跟函数名、参数和小括号跟冒号。函数体里写具体动作,return 负责把结果交出来。
def add(a, b): # 定义函数,a和b是输入参数,也叫形参 return a + b # return把计算结果交给调用方 result = add(3, 5) # 调用函数,3和5分别传给a和b print(result) # 输出 8整个过程的正确理解是:定义时 a、b 是两个占位符,还没有任何具体数值;调用时,3 和 5 被按顺序送到 a 和 b 里;函数体执行完毕,return 把相加结果送回给 result。如果你能流利地把这个过程讲给别人听,函数传参和返回值这两个概念就过关了。
零基础在函数这里最容易晕的,是拿到返回值却不接住。有些人写完函数体忘了写 return,调用的位置拿到一个 None,后面程序用到这个结果时直接出错。只要有函数不想返回值但要退出,或者不写 return,Python 就会在函数结束时返回一个 None。面试选择题里经常拿这个做文章,做题时看到“没有 return”的选项,第一反应就该是 None。
4.2 类和对象:用“图纸和房子”理解面向对象
面向对象对零基础来说是最难名状的一部分,但因为面试常考,还是要啃。它有两个绕不开的名词:类和对象。用一个类比可以迅速解开混乱:类是一张图纸,图纸上规定了房子有几间房间、门在哪边;对象是根据图纸盖出来的那一栋真实房子。类只负责描述结构,对象才真正放在那里、能被改属性。
class Cat: def __init__(self, name): # __init__在创建对象时自动执行 self.name = name # 把收到的名字存到对象自己身上 def say(self): # 类定义的方法,对象可以调用 print(self.name + " 喵喵叫") cat_a = Cat("小白") # 根据Cat图纸,创建对象cat_a cat_b = Cat("花卷") # 再创建对象cat_b,和cat_a互不干扰 cat_a.say() # 输出:小白 喵喵叫 cat_b.say() # 输出:花卷 喵喵叫先别被init这个小名吓到,它的作用只有一个:在对象出生时给对象设置初始属性。self 代表“当前这个对象自己”。执行 Cat("小白") 时,self 就是小白这个对象,self.name = "小白" 就把昵称存进这个对象。cat_a 和 cat_b 是两个独立对象,改 cat_a 的名字不会影响 cat_b。面试题经常问这种独立性:对象之间数据隔离,类里定义的只是行为模板。
很多入门的人会纠结“到底什么时候用面向对象”。初期写小程序、小脚本,不强行用类完全没问题。面试中更看重的是你的概念是否清楚:知道类是什么、对象是什么、继承怎么用。所以先把这张“图纸与房子”的图记牢,写代码时遇到类不慌就行。
4.3 异常处理:让程序出错时也能说人话
程序报错不是世界末日,而是程序在跟你说话。真正让新手崩溃的,往往是报错信息看不懂,或者看到了却选择无视,自己重新乱猜。Python 提供了异常处理机制,用 try 和 except 把可能出错的代码包起来。
try: value = int("abc") # 这句话想把字符串abc转成整数 except ValueError: # 转不了时会出现ValueError print("转换失败,输入不是数字")第一行 int("abc") 一定会报错,因为 abc 不是数字。但被 try 包住之后,程序不会直接崩溃,而是跳到 except 分支,执行打印提示。这里的 ValueError 是我们主动捕获的异常类型。面试中常见的问题是:如果 except 后面不写异常类型,能不能直接 except:?能写,但会吞掉所有异常,不利于排查。更好的习惯是写明异常类型,让代码既能处理问题,又不至于把所有错误都默默藏掉。
异常处理的核心思路,是提前预料到代码可能出现的故障,并给出一条退路。数据读取时文件不存在、用户输入时内容不符合格式,这些都是最常见的场景。初学阶段不用记住所有异常类型,先认识 ValueError、TypeError、KeyError 这三个,见到报错不再发怵,就达到目的了。
5. 基础面试避坑指南:新手最容易踩的五个翻车点
基础刷过一遍以后,真正拉开差距的,往往不是知识点本身,而是那些看似会了、一写就崩的细节。这里整理五个翻车率最高的点,每一条都按“现象→原因→解决”来讲。
5.1 可变默认参数:结果和自己想的不一样
现象:定义一个带默认参数的函数,第一次调用正常,第二次调用后第一个结果也被污染了。
def add_item(item, target=[]): # 默认参数用了一个列表 target.append(item) return target a = add_item("苹果") b = add_item("香蕉") print(a) # 输出 ['苹果', '香蕉'],而预期应该是 ['苹果']原因:默认参数在函数定义时只创建一次,并不是每次调用都新建一个空列表。第二次调用时,target 还是第一次那个列表,于是“苹果”和“香蕉”被塞进了同一个列表。
解决:默认参数改用不可变值 None,并在函数体内重新创建列表。比较稳的写法是if target is None: target = [],每一次调用都得到新的空列表,各次互不干扰。记住这句:默认参数不要用可变对象。
5.2 深浅拷贝:改一个,另一个跟着变
现象:把一个列表赋值给另一个变量,修改第二个,第一个列表也变了。
a = [1, 2, 3] b = a # 看起来是把a复制一份给b b.append(4) # b追加数据 print(a) # 输出 [1, 2, 3, 4],a也被改了原因:b = a 并没有复制内容,只是给同一个列表多贴了一张标签。a 和 b 指向同一个内存对象,所以任何一边改动,另一边都能看到。
解决:需要复制内容时用 a.copy()、list(a) 或者切片 a[:]。这些都会生成一个新列表。但要注意,如果列表里还套着列表,普通 copy 只复制外层,内层依然共享,这种情况要用 copy 模块里的 deepcopy。
提示:判断两个变量是不是指向同一个对象,可以用
a is b。如果结果是 True,说明改一个一定会影响另一个。
5.3 循环里删除列表元素:删到一半跳过数据
现象:循环遍历列表时用 remove 删除符合条件的元素,结果有些该删的没删掉。
nums = [1, 2, 2, 3, 4] for n in nums: if n == 2: nums.remove(n) # 边遍历边删除 print(nums) # 输出 [1, 2, 3, 4],有一个2没删掉原因:遍历时列表的长度在变化,内部下标不断前移,导致本轮跳过了下一个元素。
解决:不要对正在遍历的列表做删除。可以先遍历它的副本for n in nums[:]:,也可以改成用列表推导式生成新列表:nums = [n for n in nums if n != 2]。后一种写法更整洁,面试里也更受欢迎。
5.4 函数内改全局变量:改了却发现外面没变
现象:在函数里写 count = count + 1,运行时报错,或者函数内改了值,外面的全局变量没动静。
count = 0 def add(): count = count + 1 # 这里会报错:局部变量count在赋值前被使用 add()原因:函数内部只要出现对某个名字赋值的语句,Python 就把它当作局部变量,而局部 count 还没赋值就要读,于是报错。如果函数内部只给 count 赋值而不读旧值,程序不会报错,但同时也不会动外面的 count。
解决:初学阶段最直白的做法是别在函数里改全局变量,把结果通过 return 传回来,让主程序自己赋值。这样数据流向清晰,面试时讲出来也顺。极少数需要改全局的场景再声明 global count,但不要滥用。
5.5 报错只看最后一行,从开头乱猜
现象:程序报错后,不读完整的 traceback,直接凭错误信息最后一句话乱改代码,改完还是错。
原因:Python 的报错信息其实从最后一行向上读最有效。最后一行是异常类型,比如 TypeError、KeyError;往上是出错的文件和行号;再往上是具体代码片段。很多人只看到红色就慌,错过了定位信息。
解决:下次遇到报错,先冷静看最后一行,确定异常类型;再往上找 “File xxx, line 几”,打开对应文件对应行;最后看那一行的写法哪里不对。举个例子,报错写到 KeyError: 'weight',意思是字典里没有 weight 这个键,要么补上初始值,要么用 get 方法读取避免崩溃。养成这个阅读习惯之后,你会发现排查错误的效率高很多,也不会只治症状,而是真正解决病根。
6. 下一步学什么:从基础过关到冲刺面试的小路线
基础概念过完,手里的牌还不足以应付完整面试,接下来要做的是“把基础变成能力”。整个过程不建议再大量堆砌教程,而是用三件事推进。
第一件是补最简单的一批数据结构和算法。栈、队列、递归、二分查找,把它们的实现理一遍。不用刷难题,每个都找出一个典型的题做透彻,比如用栈判断左右括号是否匹配。这类题在基础面试里出现频率很高,而且能检验你对列表和递归的理解。
第二件是熟悉几个高频内置库。json 用来处理数据交换,datetime 用来处理时间,os 和 random 也经常在笔试小项目里出现。这些库不需要背,用到时查官方示例,多写几次就有印象。重点是先知道“Python 自带这些工具”,遇事不用重复造轮子。
第三件是完整写一两个小脚本,比如一个记账本、一个单词频率统计,或者一个文件整理工具。脚本规模控制在几十行到一百行之间,尽量涵盖读写文件、用列表和字典存数据、用函数拆分功能、用异常处理兜底。写完整脚本的感觉,和做小题完全不同,它会逼着你把基础点串起来。
在这个节奏里,我特别推荐每天保留十分钟“默写时间”:打开编辑器,不翻书,把当天学过的语法默写一遍。哪怕只写一个 for 循环加一个函数,也会比干看教程有用得多。我第一次学的时候,很长一段时间只听课不敲代码,觉得自己都懂了,后来发现自己连一个列表去重都要想很久。从那以后,每次学完一个新的语法点,我都会强制自己在编辑器里跑一遍,哪怕只是改一个数字。希望这个习惯也能帮到你,祝你从看懂第一行代码开始,一步步把面试基础说得清楚、写得顺手。
本文还有配套的精品资源,点击获取