Python 全栈工程师必备面试题 300 道(2020 版)

  • 2020 年 3 月 16 日
  • 笔记

Python 面试不仅需要掌握 Python 基础知识和高级语法,还会涉及网络编程、web 前端后端、数据库、网络爬虫、数据解析、数据分析和数据可视化等各方面的核心知识。

本人结合自己多年的开发经验,同时汲取网络中的精华,本着打造全网最全面最深入的面试题集,分类归纳总结了 Python 面试中的核心知识点,这篇文章不论是从深度还是广度上来讲,都已经囊括了非常多的知识点了,读者可以根据自己的需要强化升级自己某方面的知识点,文中所有案例在 Python3.6 环境下都已通过运行。

本文章是作者呕心沥血,耗时两个月潜心完成。通过阅读本文章,可以在最短的时间内获取 Python 技术栈最核心的知识点,同时更全面更深入的了解与 Python 相关的各项技术。

文章内容目录

1. Python 基础知识

1.1 语言特征及编码规范

1.1.1 Python 的解释器有哪些? 1.1.2 列举至少 5 条 Python 3 和 Python 2 的区别? 1.1.3 Python 中新式类和经典类的区别是什么? 1.1.4 Python 之禅是什么,Python 中如何获取 Python 之禅?

1.1.5 python中的DocStrings(解释文档)有什么作用? 1.1.6 Python 3 中的类型注解有什么好处?如何使用? 1.1.7 Python 语言中的命名规范有哪些? 1.1.8 Python 中各种下划线的作用? 1.1.9 单引号、双引号、三引号有什么区别?

1.2 文件 I/O 操作 1.2.1 Python 中打开文件有哪些模式? 1.2.2 Python 中 read 、readline 和 readlines 的区别? 1.2.3 大文件只需读取部分内容,或者避免读取时候内存不足的解决方法?

1.2.4 什么是上下文?with 上下文管理器原理? 1.2.5 什么是全缓冲、行缓冲和无缓冲? 1.2.6 什么是序列化和反序列化?JSON 序列化时常用的四个函数是什么?

1.2.7 JSON 中 dumps 转换数据时候如何保持中文编码?

1.3 数据类型 1.3.1 Python 中的可变和不可变数据类型是什么? 1.3.2 is 和 == 有什么区别? 1.3.3 Python 中的单词大小写转换和字母统计? 1.3.4 字符串,列表,元组如何反转?反转函数 reverse 和 reversed 的区别?

1.3.5 Python 中的字符串格式化的方法有哪些?f-string 格式化知道吗?

1.3.6 含有多种符号的字符串分割方法? 1.3.7 嵌套列表转换为列表,字符串转换为列表的方法 1.3.8 列表合并的常用方法? 1.3.9 列表如何去除重复的元素,还是保持之前的排序? 1.3.10 列表数据如何筛选,筛选出符合要求的数据? 1.3.11 字典中元素的如何排序?sorted 排序函数的使用详解? 1.3.12 字典如何合并?字典解包是什么? 1.3.13 字典推导式使用方法?字典推导式如何格式化 cookie 值? 1.3.14 zip 打包函数的使用?元组或者列表中元素生成字典? 1.3.15 字典的键可以是哪些类型的数据? 1.3.16 变量的作用域是怎么决定的?

1.4 常用内置函数 1.4.1 如何统计一篇文章中出现频率最高的 5 个单词? 1.4.2 map 映射函数按规律生成列表或集合? 1.4.3 filter 过滤函数如何使用?如何过滤奇数偶数平方根数?

1.4.4 sort 和 sorted 排序函数的用法区别? 1.4.5 enumerate 为元素添加下标索引? 1.4.6 lambda 匿名函数如何使用?

1.4.7 type 和 help 函数有什么作用?

2. Python 高级语法

2.1 类和元类 2.1.1 类 class 和元类 metaclass 的有什么区别? 2.1.2 类实例化时候,__init__ 和 __new__ 方法有什么作用?

2.1.3 实例方法、类方法和静态方法有什么不同? 2.1.4 类有哪些常用的魔法属性以及它们的作用是什么? 2.1.5 类中的 property 属性有什么作用? 2.1.6 描述一下抽象类和接口类的区别和联系? 2.1.7 类中的私有化属性如何访问? 2.1.8 类如何才能支持比较操作? 2.1.9 hasattr()、getattr()、setattr()、delattr()分别有什么作用?

2.2 高级用法(装饰器、闭包、迭代器、生成器) 2.2.1 编写函数的四个原则是什么? 2.2.2 函数调用参数的传递方式是值传递还是引用传递? 2.2.3 Python 中 pass 语句的作用是什么? 2.2.4 闭包函数的用途和注意事项? 2.2.5 *args 和 **kwargs 的区别? 2.2.6 位置参数、关键字参数、包裹位置参数、包裹关键字参数执行顺序及使用注意?

2.2.7 如何进行参数拆包? 2.2.8 装饰器函数有什么作用?装饰器函数和普通函数有什么区别? 2.2.9 带固定参数和不定参数的装饰器有什么区别? 2.2.10 描述一下一个装饰器的函数和多个装饰器的函数的执行步骤? 2.2.11 知道通用装饰器和类装饰器吗? 2.2.12 浅拷⻉和深拷⻉的区别? 2.2.13 元组的拷⻉要注意什么? 2.2.14 全局变量是否一定要使用 global 进行声明? 2.2.15 可迭代对象和迭代器对象有什么区别? 2.2.16 描述一下 for 循环执行的步骤? 2.2.17 迭代器就是生成器,生成器一定是迭代器,这句话对吗? 2.2.18 yield 关键字有什么好处? 2.2.19 yield 和 return 关键字的关系和区别? 2.2.20 简单描述一下 yield 生成器函数的执行步骤? 2.2.21 生成器函数访问方式有哪几种?生成器函数中的 send() 有什么作用? 2.2.22 Python 中递归的最大次数? 2.2.23 递归函数停止的条件是什么?

2.4 模块 2.4.1 如何查看模块所在的位置? 2.4.2 import 导入模块时候,搜索文件的路径顺序?

2.4.3 多模块导入共享变量的问题? 2.4.4 Python 常用内置模块有哪些? 2.4.5 Python 中常⻅的异常有哪些? 2.4.6 如何捕获异常?万能异常捕获是什么?

2.4.7 Python 异常相关的关键字主要有哪些?

2.4.8 异常的完整写法是什么? 2.4.9 包中的 __init__.py 文件有什么作用?

2.4.10 模块内部的 __name__ 有什么作用?

2.5 面向对象 2.5.1 面向过程和面向对象编程的区别?各自的优缺点和应用场景?

2.5.2 面向对象设计的三大特征是什么? 2.5.3 面向对象中有哪些常用概念? 2.5.4 多继承函数有那几种书写方式? 2.5.5 多继承函数执行的顺序(MRO)? 2.5.6 面向对象的接口如何实现?

2.6 设计模式 2.6.1 什么是设计模式? 2.6.2 面向对象中设计模式的六大原则是什么?

2.6.3 列举几个常⻅的设计模式? 2.6.4 Mixin 设计模式是什么?它的特点和优点?

2.6.5 什么是单例模式?单例模式的作用? 2.6.7 单例模式的应用场景有那些?

2.7 内存管理 2.7.1 Python 的内存管理机制是什么? 2.7.2 Python 的内寸管理的优化方法? 2.7.3 Python 中内存泄漏有哪几种? 2.7.4 Python 中如何避免内存泄漏? 2.7.5 内存溢出的原因有哪些? 2.7.6 Python 退出时是否释放所有内存分配?

3. 系统编程

3.1 多进程、多线程、协程、并行、并发、锁

3.1.1 并发与并行的区别和联系? 3.1.2 程序中的同步和异步与现实中一样吗? 3.1.3 进程、线程、协程的区别和联系? 3.1.4 多进程和多线程的区别? 3.1.5 协程的优势是什么? 3.1.6 多线程和多进程分别用于哪些场景? 3.1.7 全局解释器锁(GIL)是什么?如何解决 GIL 问题? 3.1.8 Python 中有哪些锁(LOCK)?它们分别有什么作用? 3.1.9 Python 中如何实现多线程和多进程? 3.1.10 守护线程和非守护线程是什么? 3.1.11 多线程的执行顺序是什么样的? 3.1.12 多线程非安全是什么意思? 3.1.13 互斥锁是什么?有什么好处和坏处? 3.1.14 什么是僵尸进程和孤儿进程? 3.1.15 多线程和多进程如何实现通信? 3.1.16 Python 3 中 multiprocessing.Queue() 和 queue.Queue() 的区别?

3.1.17 如何使用多协程并发请求网⻚?

3.1.18 简单描述一下 asyncio 模块实现异步的原理?

4. 网络编程

4.1 TCP UDP HTTP SEO WSGI 等 4.1.1 UDP 和 TCP 有什么区别以及各自的优缺点? 4.1.2 IP 地址是什么?有哪几类? 4.1.3 举例描述一下端口有什作用? 4.1.4 不同电脑上的进程如何实现通信的? 4.1.5 列举一下常用网络通信名词? 4.1.6 描述一下请求一个网⻚的步骤(浏览器访问服务器的步骤)?

4.1.7 HTTP 与 HTTPS 协议有什么区别? 4.1.8 TCP 中的三次握手和四次挥手是什么? 4.1.9 TCP 短连接和⻓连接的优缺点?各自的应用场景? 4.1.10 TCP 第四次挥手为什么要等待 2MSL? 4.1.11 HTTP 最常⻅的请求方法有哪些? 4.1.12 GET 请求和 POST 请求有什么区别? 4.1.13 cookie 和 session 的有什么区别? 4.1.14 七层模型和五层模型是什么? 4.1.15 HTTP 协议常⻅状态码及其含义? 4.1.16 HTTP 报文基本结构?列举常用的头部信息? 4.1.17 SEO 是什么? 4.1.18 伪静态 URL、静态 URL 和动态 URL 的区别? 4.1.19 浏览器镜头请求和动态请求过程的区别? 4.1.20 WSGI 接口有什么好处? 4.1.21 简单描述浏览器通过 WSGI 接口请求动态资源的过程?

5. 数据库

5.1 MySQL

5.1.1 NoSQL 和 SQL 数据库的比较? 5.1.2 了解 MySQL 的事物吗?事物的四大特性是什么?

5.1.3 关系型数据库的三范式是什么? 5.1.4 关系型数据库的核心元素是什么? 5.1.5 简单描述一下 Python 访问 MySQL 的步骤?

5.1.6 写一个 Python 连接操作 MySQL 数据库实例?

5.1.7 SQL 语句主要有哪些?分别有什么作用? 5.1.8 MySQL 有哪些常用的字段约束? 5.1.9 什么是视图?视图有什么作用? 5.1.10 什么是索引?索引的优缺点是什么? 5.1.11 NULL 是什么意思?它和空字符串一样吗?

5.1.12 主键、外键和索引的区别? 5.1.13 char 和 varchar 的区别? 5.1.14 SQL 注入是什么?如何避免 SQL 注入? 5.1.15 存储引擎 MyISAM 和 InnoDB 有什么区别?

5.1.16 MySQL 中有哪些锁?

5.1.17 三种删除操作 drop、truncate、delete 的区别?

5.1.18 MySQL 中的存储过程是什么?有什么优点?

5.1.19 MySQL 数据库的有哪些种类的索引? 5.1.20 MySQL 的事务隔离级别?

5.1.21 MySQL 中的锁如何进行优化? 5.1.22 解释 MySQL 外连接、内连接与自连接的区别?

5.1.23 如何进行 SQL 优化? 5.1.24 什么是 MySQL 主从?主从同步有什么好处?

5.1.25 MySQL 主从与 MongoDB 副本集有什么区别?

5.1.26 MySQL 账户权限怎么分类的? 5.1.27 如何使用 Python 面向对象操作 MySQL 数据库?

5.2 Redis

5.2.1 Redis 是什么?常⻅的应用场景?

5.2.2 Redis 常⻅数据类型有哪些?各自有什么应用场景?

5.2.3 非关系型数据库 Redis 和 MongoDB 数据库的结构有什么区别?

5.2.4 Redis 和 MongoDB 数据库的键(key)和值(value)的区别?

5.2.5 Redis 持久化机制是什么?有哪几种方式?

5.2.6 Redis 的事务是什么?

5.2.7 为什么要使用 Redis 作为缓存?

5.2.8 Redis 和 Memcached 的区别?

5.2.9 Redis 如何设置过期时间和删除过期数据?

5.2.10 Redis 有哪几种数据淘汰策略? 5.2.11 Redis 为什么是单线程的? 5.2.12 单线程的 Redis 为什么这么快? 5.2.13 缓存雪崩和缓存穿透是什么?如何预防解决? 5.2.14 布隆过滤器是什么? 5.2.15 简单描述一下什么是缓存预热、缓存更新和缓存降级? 5.2.16 如何解决 Redis 的并发竞争 Key 的问题? 5.2.17 写一个 Python 连接操作 Redis 数据库实例? 5.2.18 什么是分布式锁? 5.2.19 Python 如何实现一个 Redis 分布式锁? 5.2.20 如何保证缓存与数据库双写时的数据一致性? 5.2.21 集群是什么?Redis 有哪些集群方案? 5.2.22 Redis 常⻅性能问题和解决方案? 5.2.23 了解 Redis 的同步机制么? 5.2.24 如果有大量的 key 需要设置同一时间过期,一般需要注意什么?

5.2.25 如何使用 Redis 实现异步队列? 5.2.26 列举一些常用的数据库可视化工具?

5.3 MongoDB

5.3.1 NoSQL 数据库主要分为哪几种?分别是什么?

5.3.2 MongoDB 的主要特点及适用于哪些场合?

5.3.3 MongoDB 中的文档有哪些特性? 5.3.4 MongoDB 中的 key 命名要注意什么?

5.3.5 MongoDB 数据库使用时要注意的问题? 5.3.6 常用的查询条件操作符有哪些? 5.3.7 MongoDB 常用的管理命令有哪些? 5.3.8 MongoDB 为何使用 GridFS 来存储文件? 5.3.9 如果一个分片(Shard)停止或很慢的时候,发起一个查询会怎样?

5.3.10 分析器在 MongoDB 中的作用是什么?

5.3.11 MongoDB 中的名字空间(namespace)是什么? 5.3.12 更新操作会立刻 fsync 到磁盘吗? 5.3.13 什么是 master 或 primary?什么是 secondary 或 slave?

5.3.14 必须调用 getLastError 来确保写操作生效了么? 5.3.15 MongoDB 副本集原理及同步过程? 5.3.16 MongoDB 中的分片是什么意思? 5.3.17 “ObjectID”有哪些部分组成? 5.3.18 在 MongoDB 中什么是索引? 5.3.19 什么是聚合? 5.3.20 写一个 Python 连接操作 MongoDB 数据库实例?

6. 数据解析提取

6.1 正则表达式

6.1.1 match、search 和 findall 有什么区别?

6.1.2 正则表达式的 ()、[]、{} 分别代表什么意思? 6.1.3 正则表达式中的 .* 、 .+ 、 .*? 、 .+? 有什么区别? 6.1.4 .*? 贪婪匹配的一种特殊情况?当 * 和 ? 中间有一个字符会怎么样? 6.1.5 s 和 S 是什么意思?re.S 是什么意思? 6.1.6 写一个表达式匹配座机或者手机号码? 6.1.7 正则表达式检查 Python 中使用的变量名是否合法? 6.1.8 正则表达式检查邮箱地址是否符合要求? 6.1.9 如何使用分组匹配 HTML 中的标签元素? 6.1.10 如何使用 re.sub 去掉“028-00112233 # 这是一个电话号码”# 和后面的注释内容?

6.1.11 re.sub 替换如何支持函数调用?举例说明? 6.1.12 如何只匹配中文字符? 6.1.13 如何过滤评论中的表情? 6.1.14 Python 中的反斜杠 如何使用正则表达式匹配? 6.1.15 如何提取出下列网址中的域名? 6.1.16 去掉 'ab;cd%etfg,,jklioha;hp,vrwwtyz' 中的符号,拼接为一个字符串? 6.1.17 str.replace 和 re.sub 替换有什么区别? 6.1.18 如何使用重命名分组修改日期格式? 6.1.19 (?:x) a(?=x) a(?!=x) (?<=x)a (?<!x)a 有什么区别?

6.2 XPath

6.2.1 XML 是什么?XML 有什么用途?

6.2.2 XML 和 HTML 之间有什么不同?

6.2.3 描述一下 XML lxml XPath 之间有什么关系?

6.2.4 介绍一下 XPath 的节点?

6.2.5 XPath 中有哪些类型的运算符?

6.2.6 XPath 中的 /// 、 ./ 、 ../ 、 .// 别有什么区别?

6.2.7 XPath 中如何同时选取多个路径?

6.2.8 XPath 中的 * 和 @* 分别表示什么含义? 6.2.9 如何使用位置属性选取节点中的元素?

6.2.10 XPath 中如何多条件查找?

6.2.11 Scrapy 和 lxml 中的 XPath 用法有什么不同?

6.2.12 用过哪些常用的 XPath 开发者工具?

6.3 BeautifulSoup4

6.3.1 BeautifulSoup4 是什么?有什么特点?

6.3.2 三种解析工具:正则表达式 lxml BeautifulSoup4 各自有什么优缺点?

6.3.3 etree.parse()、etree.HTML() 和 etree.tostring() 有什么区别? 6.3.4 BeautifulSoup4 支持的解析器以及它们的优缺点? 6.3.5 BeautifulSoup4 中的四大对象是什么? 6.3.6 BeautifulSoup4 中如何格式化 HTML 代码? 6.3.7 BeautifulSoup4 中 find 和 find_all 方法的区别? 6.3.8 string、strings 和 stripped_strings 有什么区别? 6.3.9 BeautifulSoup4 输出文档的编码格式是什么?

7. 网络爬虫

7.1 网络爬虫是什么?它有什么特征? 7.2 Python 中常用的爬虫模块和框架有哪些?它们有什么优缺点?

7.3 搜索引擎中的 ROBOTS 协议是什么? 7.4 urlib 和 requests 库请求网⻚有什么区别? 7.5 网⻚中的 ASCII Unicode UTF-8 编码之间的关系? 7.6 urllib 如何检测网⻚编码? 7.7 urllib 中如何使用代理访问网⻚? 7.8 如果遇到不信任的 SSL 证书,如何继续访问? 7.9 如何提取和使用本地已有的 cookie 信息? 7.10 requests 请求中出现乱码如何解决? 7.11 requests 库中 response.text 和 response.content 的区别?

7.12 实际开发中用过哪些框架? 7.13 Scrapy 和 PySpider 框架主要有哪些区别? 7.14 Scrapy 的主要部件及各自有什么功能? 7.15 描述一下 Scrapy 爬取一个网站的工作流程? 7.16 Scrapy 中的中间件有什么作用? 7.17 Scrapy 项目中命名时候要注意什么? 7.18 Scrapy 项目中的常用命令有哪些? 7.19 scrapy.Request() 中的 meta 参数有什么作用? 7.20 Python 中的协程阻塞问题如何解决? 7.21 Scrapy 中常用的数据解析提取工具有哪些? 7.22 描述一下 Scrapy 中数据提取的机制? 7.23 Scrapy 是如何实现去重的?指纹去重是什么? 7.24 Item Pipeline 有哪些应用? 7.25 Scrapy 中常用的调试技术有哪些? 7.26 Scrapy 中有哪些常⻅异常以及含义?

7.27 Spider、CrawlSpider、XMLFeedSpider 和 RedisSpider 有什么区别?

7.28 scrapy-redis 是什么?相比 Scrapy 有什么优点?

7.29 使用 scrapy-redis 分布式爬虫,需要修改哪些常用的配置? 7.30 常⻅的反爬虫措施有哪些?如何应对?

7.31 BloomFitler 是什么?它的原理是什么?

7.32 为什么会用到代理?代码展现如何使用代理? 7.33 爬取的淘宝某个人的历史消费信息(登陆需要账号、密码、验证码),你会如何操作?7.34 网站中的验证码是如何解决的? 7.35 动态⻚面如何有效的抓取? 7.36 如何使用 MondoDB 和 Flask 实现一个 IP 代理池?

8. 数据分析及可视化

8.1 Python 数据分析通常使用的环境、工具和库都有哪些?库功能是什么?

8.2 常用的数据可视化工具有哪些?各自有什么优点? 8.3 数据分析的一般流程是什么? 8.4 数据分析中常⻅的统计学概念有哪些? 8.5 归一化方法有什么作用? 8.6 常⻅数据分析方法论? 8.7 如何理解欠拟合和过拟合? 8.8 为什么说朴素⻉叶斯是“朴素”的? 8.9 Matplotlib 绘图中如何显示中文? 8.10 Matplotlib 中如何在一张图上面画多张图? 8.11 使用直方图展示多部电影 3 天的票房情况? 8.12 描述一下 NumPy array 对比 Python list 的优势? 8.13 数据清洗有哪些方法?