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 數據清洗有哪些方法?