(下))
14. 类型提示 Pydanticdef add(a: int, b: int) - int: # 类型提示运行时不强制 return a b from pydantic import BaseModel # FastAPI 数据校验 class Item(BaseModel): name: str price: float 0.0 # 默认值 tags: list[str] [] item Item(namex, price9.9) # 自动类型转换/校验面试话术类型提示的作用是让代码可读、IDE 能提示运行时不做强制而我在我的项目中使用了FastAPI 的 Pydantic BaseModel 做请求体校验、自动转换、生成文档。我在项目里用它定义所有 API 请求/响应模型。15. 内存管理与垃圾回收面试话术CPython 内存管理核心有两个引用计数和分代 GC。引用计数快但解决不了循环引用分代 GC 定期扫描兜底。写代码时避免大循环引用结构。Python 用引用计数为主分代垃圾回收处理循环引用。相关概念简单了解一下就行引用计数对象被引用次数归零立即回收——快但处理不了循环引用A→B→A分代 GC定期扫描generation 0/1/2越老扫描越少处理循环引用查看sys.getrefcount(x)、gc.collect()手动触发del只是删引用不保证立即回收16.slotsclass Point: __slots__ (x, y) # 固定属性不能动态加 def __init__(self, x, y): ... p Point(1, 2) p.z 3 # AttributeError要点省内存省掉实例的dict、属性访问更快、限制动态属性。17.initvsnew__new__创建实例类方法先执行返回实例__init__初始化实例后执行单例模式就是重写new代码块class Singleton: _instance None def __new__(cls): if cls._instance is None: cls._instance super().__new__(cls) return cls._instance18. functools.lru_cachefrom functools import lru_cache lru_cache(maxsize128) # 自动缓存函数结果 def fib(n): return n if n 2 else fib(n-1) fib(n-2)要点函数式缓存——相同入参直接返回缓存结果用于纯函数无副作用。19. 元类metaclass类的类指的是控制类的创建过程。type是默认元类class Foo(metaclassMyMeta)指定。要点面试一般只考概念知道「元类 类的类控制类的创建行为」即可不问实现。20. f-string / 常用内置函数name, score Alice, 95.678 f{name} 得了 {score:.1f} 分 # Alice 得了 95.7 分 enumerate(lst) # 带索引遍历 zip(a, b) # 并行打包 sorted(lst, keylambda x: x[1], reverseTrue) # 按第二元素降序 any/all(lst) # 任一/全部为真 set(a) set(b) # 交集 | 并集 - 差集 defaultdict / Counter # collections 常用21. 全局变量修改 / globalcount 0 def inc(): global count # 不加 global 会报 UnboundLocalError count 122. join指的是将多个字符串直接拼接而Join指的是根据指定分割符将字符串输出指定格式。,.join([a, b, c]) # 比 循环快 每次建新字符串23. Python 2 vs 3 区别面试回答python3相比于python2 有这些区别print 函数化、整数除法3 是浮点、str 是 unicode、range 惰性24.面试答题通用技巧先给结论再展开「一句话答案 为什么 我的实战」不会的诚实说「这个概念我没深入但按我的理解是…… 我项目里类似的是……」代码题先说思路再写「我打算三步先……再……最后……」画图辅助复习异步/装饰器/内存时搜索相关图片来展示时间控制单个问题 1-2 分钟别超 3 分钟附录 APython 基础函数速查面试常考实操A1. 列表操作lst [5, 3, 8, 1, 3] # 查询 lst[0] # 取第一个5 lst[-1] # 取最后一个3 lst[1:3] # 切片[3, 8]含头不含尾重点左闭右开。有时候容易忘记尤其是看到两个中括号会记成左闭右闭 lst.index(8) # 查找元素位置2不存在会报 ValueError lst.count(3) # 统计出现次数2 3 in lst # 判断是否存在True # 增删改 lst.append(9) # 末尾添加 lst.insert(1, 99) # 指定位置插入 lst.extend([7,8]) # 批量添加 lst.pop() # 删除并返回最后一个 lst.pop(0) # 删除并返回指定位置 lst.remove(3) # 删除第一个匹配值 del lst[0] # 按位置删除 # 排序高频 sorted(lst) # 返回新排序列表不修改原列表 sorted(lst, reverseTrue) # 降序 lst.sort() # 原地排序修改原列表 sorted(lst, keylambda x: abs(x)) # 按自定义规则排序排序排名的面试题(应届生可能会让你手撕社招就别想了没那么容易问题① 列表 scores[78,92,85,60,95] 找最高分最低分、降序排序、输出排名② 列表去重且保持顺序③ 两个列表合并求和。代码给你们自己去背# 1. 分数统计与排名 scores [78, 92, 85, 60, 95] sorted_scores sorted(scores, reverseTrue) # 降序 print(f最高分: {max(scores)}, 最低分: {min(scores)}) print(f降序排序: {sorted_scores}) print(排名:) for i, score in enumerate(sorted_scores, 1): print(f 第{i}名: {score}分) # 2. 列表去重且保持顺序 lst [3, 1, 2, 3, 2, 4, 5, 1] # dict.fromkeys 会自动去重并保持插入顺序Python 3.7 unique list(dict.fromkeys(lst)) print(f去重后: {unique}) # 3. 两个列表合并求和 a [10, 20, 30] b [5, 15, 25] total sum(a b) # 或 sum(a) sum(b) print(f合并求和: {total})问题给你一组字典scores [(张三, 90), (李四, 85), (王五, 95)]内容是姓名和对应的Python程序设计分数请你根据得分从高到低就行排序和输出。python scores [(张三, 90), (李四, 85), (王五, 95)] ranked sorted(scores, keylambda x: x[1], reverseTrue) for i, (name, score) in enumerate(ranked, 1): print(f第{i}名{name}{score}分) # 输出第1名王五95分 / 第2名张三90分 / 第3名李四85分 A2. 求和与统计python sum([1, 2, 3]) # 6 sum(range(1, 101)) # 50501到100求和 max([3, 7, 2]) # 7 min([3, 7, 2]) # 2 len([1, 2, 3]) # 3 abs(-5) # 5 round(3.14159, 2) # 3.14 A3. 字符串操作python s Hello, World s.strip() # 去首尾空格 s.lower() / s.upper() # 转小写/大写 s.replace(World, Python) # 替换 s.split(,) # 按逗号切分 ,.join([a,b]) # 拼接a,bjoin 是 split 的反向 s.startswith(He) # True s.endswith(d) # True len(s) # 长度 A4. 字典操作python d {a: 1, b: 2} d[a] # 1不存在会 KeyError d.get(c, 0) # 0安全取值不存在返回默认值 d.keys() / d.values() / d.items() # 键/值/键值对 d.update({c: 3}) # 批量添加 d.pop(a) # 删除并返回值 d.setdefault(x, 10) # 不存在才设置 for k, v in d.items(): print(k, v) A5. 集合操作python a {1, 2, 3}; b {2, 3, 4} a b # 交集 {2, 3} a | b # 并集 {1, 2, 3, 4} a - b # 差集 {1} a ^ b # 对称差 {1, 4} A6. 常用内置函数python enumerate(lst) # 带索引遍历 zip(a, b) # 并行打包成元组对 any([0, 0, 1]) # True任一为真 all([1, 1, 0]) # False全部为真 list(range(5)) # [0,1,2,3,4] type(3) # class int isinstance(3, int) # True A7. 文件操作讲师必教python # 读 with open(a.txt, r, encodingutf-8) as f: content f.read() # 全读小文件 lines f.readlines() # 读成行列表 for line in f: # 逐行读大文件推荐省内存 print(line) # 写 with open(b.txt, w, encodingutf-8) as f: # w覆盖 a追加 f.write(内容) A8. 面试场景题速答场景答案如何查询一个列表里有没有某元素x in lst要位置用lst.index(x)如何展示排名sorted(lst, reverseTrue)排序后enumerate(..., 1)编号求一堆数的和sum(lst)条件求和用sum(x for x in lst if x 0)去掉列表重复元素list(set(lst))注意会乱序保序用dict.fromkeys(lst)统计每个元素出现次数from collections import Counter; Counter(lst)字典按键/值排序按键sorted(d)按值sorted(d.items(), keylambda x: x[1])反转字符串s[::-1]反转列表lst[::-1]两个列表变字典dict(zip(keys, vals))