## 項目主頁
[https://github.com/yidao620c/python3-cookbook](https://github.com/yidao620c/python3-cookbook)
## 譯者的話
人生苦短,我用Python!
譯者一直堅持使用Python3,因為它代表了Python的未來。雖然向后兼容是它的硬傷,但是這個局面遲早會改變的,而且Python3的未來需要每個人的幫助和支持。目前市面上的教程書籍,網上的手冊大部分基本都是2.x系列的,專門基于3.x系列的書籍少的可憐。
最近看到一本《Python Cookbook》3rd Edition,完全基于Python3,寫的也很不錯。為了Python3的普及,我也不自量力,想做點什么事情。于是乎,就有了翻譯這本書的沖動了!這不是一項輕松的工作,卻是一件值得做的工作:不僅方便了別人,而且對自己翻譯能力也是一種鍛煉和提升。
譯者會堅持對自己每一句的翻譯負責,力求高質量。但受能力限制,也難免有疏漏或者表意不當的地方。如果譯文中有什么錯漏的地方請大家見諒,也歡迎大家隨時指正: [yidao620@gmail.com](#)
## 作者的話
自從2008年以來,Python3橫空出世并慢慢進化。Python3的流行一直被認為需要很長一段時間。事實上,到我寫這本書的2013年,絕大部分的Python程序員仍然在生產環境中使用的是版本2系列,最主要是因為Python3不向后兼容。毫無疑問,對于工作在遺留代碼上的每個程序員來講,向后兼容是不得不考慮的問題。但是放眼未來,你就會發現Python3給你帶來不一樣的驚喜。
正如Python3代表未來一樣,新的《Python Cookbook》版本相比較之前的版本有了一個全新的改變。最重要的是,這個意味著本書是一本非常前沿的參考書。書中所有代碼都是在Python3.3版本下面編寫和測試的,并沒有考慮之前老版本的兼容性,也沒有標注舊版本下的解決方案。這樣子可能會有爭議,但是我們最終的目的是寫一本完全基于最新最先進工具和語言的書籍。希望這本書能成為在Python3下編碼和想升級之前遺留代碼的程序員的優秀教程。
毫無疑問,編寫一本這樣的書會冒一定的編輯風險。如果在網上搜索Python教程的話,會搜到很多很多。比如ActiveState’s Python recipes或者Stack Overflow,但是絕大部分都已經是過時的了。這些教程除了是基于Python2編寫之外,可能還有很多解決方案在不同的版本之間是不一樣的(比如2.3和2.4版本)。另外,它們還會經常使用一些過時的技術,這些已經內置到Python3.3里面去了。尋找完全基于Python3的教程真的難上加難啊。
這本書的所有主題都是基于已經存在的代碼和技術,而不是專門去尋找Python3特有的教程。在原有代碼基礎上,我們完全使用最新的Python技術去改造。所以,任何想使用最新技術編寫代碼的程序員,都可以將本書當做一本很好的參考書籍。
在討論的主題選擇方面,我們不可能囊括Python領域所有的東西。因此,我們優先選擇了Python語言核心部分,以及一些在開發中常見的問題和任務。另外,這里討論的很多技術都是Python 3最新才出現的,所以如果工作在Python老版本下,即便是最有經驗的程序員可能之前也沒見過這些東西。另外,這些示例程序也會偏向于展示一些有用的編程技術(比如設計模式),而不是僅僅定位在一些具體的問題上。盡管也提及到了有一些第三方包,但是本書主要定位在Python語言核心和標準庫。
## 這本書適合誰
這本書的目標讀者是那些想深入理解Python語言機制和最新編程技能的資深程序員。很多討論都是標準庫,框架和應用程序使用到的高級技術。本書所有示例均假設讀者已經有了一定的編程背景并且可以很容易的讀懂相關主題(比如基本的計算機科學知識,數據結構知識,算法復雜度,系統編程,并行,C語言編程等)。另外,每個示例都只是一個入門指導,如果讀者想深入研究,需要自己去查閱更多資料。因此,我們假定讀者可以很熟練的使用搜索引擎以及知道怎樣查詢在線的Python文檔。
這本書不適合Python的初學者。事實上,本書已經假定了讀者已經有了一定的Python基礎,看完過幾本入門書籍。本書也不是那種快速參考手冊(可以很快的查詢某個模塊下的某個函數)。本書旨在聚焦幾個最重要的主題,演示幾種可能的解決方案,作為一個跳板,你可以經此進入一些更高級的主題,這些可以在網上或者參考手冊中找到。
## 本書示例代碼
本書幾乎所有源代碼均可以在 [http://github.com/dabeaz/python-cookbook](http://github.com/dabeaz/python-cookbook) 上面找到。作者歡迎各位修正bug,改進代碼和評論。
本書就是幫助你完成你的工作。一般來講,只要在本書上面的實例代碼,你都可以隨時拿過去在你的源碼和文檔中使用。你不需要向我們申請許可,除非你抄襲的太過分了。比如說復制幾個代碼片段去完成一個程序是不需要許可的,販賣或者分發實例代碼的光盤也不需要許可,引用本書和實例代碼去網上回答一個問題也不需要許可。但是,合并大量的代碼帶你的正式產品或文檔中去必須得到我們的許可。
我們不會要求你添加代碼的出處,包括標題,作者,出版社,ISBN。比如:Python Cookbook, 3rd edition, by David Beazley and Brian K. Jones (O’Reilly).Copyright 2013 David Beazley and Brian Jones, 978-1-449-34037-7.但是如果你這么做了,我們會很感激的。
## 聯系我們
請將關于本書的評論和問題發送給出版社:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
800-998-9938 (in the United States or Canada)
707-829-0515 (international or local)
707-829-0104 (fax)
本書網站: [http://oreil.ly/python_cookbook_3e](http://oreil.ly/python_cookbook_3e) ,上面有勘誤表,示例和一些其他信息。
如果想要評論或者是問一下本書技術方面的問題, 請發送郵件至: [bookquestions@oreilly.com](#)
更多關于我們的書籍,討論會,新聞, 請訪問我們的網站: [http://www.oreilly.com](http://www.oreilly.com)
在Facebook上查找我們: [http://facebook.com/oreilly](http://facebook.com/oreilly)
在Twitter上關注我們: [http://twitter.com/oreillymedia](http://twitter.com/oreillymedia)
在YouTube上觀看我們: [http://www.youtube.com/oreillymedia](http://www.youtube.com/oreillymedia)
## 感謝
我們由衷的感謝本書的技術審核者Jake Vanderplas, Robert Kern 和 Andrea Crotti的非常有有用的評論和建議,還有Python社區的幫助和鼓勵。我們還想感謝上一個版本的編輯Jake Vanderplas, Robert Kern,and Andrea Crotti。盡管這個版本是最新的,但是前一個版本已經提供了一個感興趣主題和解決方案的框架。最后,最最重要的就是,我們要感謝所有預覽版本的讀者,他們的評論和改進意見對本書很有幫助。
- Copyright
- 前言
- 第一章:數據結構和算法
- 1.1 解壓序列賦值給多個變量
- 1.2 解壓可迭代對象賦值給多個變量
- 1.3 保留最后N個元素
- 1.4 查找最大或最小的N個元素
- 1.5 實現一個優先級隊列
- 1.6 字典中的鍵映射多個值
- 1.7 字典排序
- 1.8 字典的運算
- 1.9 查找兩字典的相同點
- 1.10 刪除序列相同元素并保持順序
- 1.11 命名切片
- 1.12 序列中出現次數最多的元素
- 1.13 通過某個關鍵字排序一個字典列表
- 1.14 排序不支持原生比較的對象
- 1.15 通過某個字段將記錄分組
- 1.16 過濾序列元素
- 1.17 從字典中提取子集
- 1.18 映射名稱到序列元素
- 1.19 轉換并同時計算數據
- 1.20 合并多個字典或映射
- 第二章:字符串和文本
- 2.1 使用多個界定符分割字符串
- 2.2 字符串開頭或結尾匹配
- 2.3 用Shell通配符匹配字符串
- 2.4 字符串匹配和搜索
- 2.5 字符串搜索和替換
- 2.6 字符串忽略大小寫的搜索替換
- 2.7 最短匹配模式
- 2.8 多行匹配模式
- 2.9 將Unicode文本標準化
- 2.10 在正則式中使用Unicode
- 2.11 刪除字符串中不需要的字符
- 2.12 審查清理文本字符串
- 2.13 字符串對齊
- 2.14 合并拼接字符串
- 2.15 字符串中插入變量
- 2.16 以指定列寬格式化字符串
- 2.17 在字符串中處理html和xml
- 2.18 字符串令牌解析
- 2.19 實現一個簡單的遞歸下降分析器
- 2.20 字節字符串上的字符串操作
- 第三章:數字日期和時間
- 3.1 數字的四舍五入
- 3.2 執行精確的浮點數運算
- 3.3 數字的格式化輸出
- 3.4 二八十六進制整數
- 3.5 字節到大整數的打包與解包
- 3.6 復數的數學運算
- 3.7 無窮大與NaN
- 3.8 分數運算
- 3.9 大型數組運算
- 3.10 矩陣與線性代數運算
- 3.11 隨機選擇
- 3.12 基本的日期與時間轉換
- 3.13 計算最后一個周五的日期
- 3.14 計算當前月份的日期范圍
- 3.15 字符串轉換為日期
- 3.16 結合時區的日期操作
- 第四章:迭代器與生成器
- 4.1 手動遍歷迭代器
- 4.2 代理迭代
- 4.3 使用生成器創建新的迭代模式
- 4.4 實現迭代器協議
- 4.5 反向迭代
- 4.6 帶有外部狀態的生成器函數
- 4.7 迭代器切片
- 4.8 跳過可迭代對象的開始部分
- 4.9 排列組合的迭代
- 4.10 序列上索引值迭代
- 4.11 同時迭代多個序列
- 4.12 不同集合上元素的迭代
- 4.13 創建數據處理管道
- 4.14 展開嵌套的序列
- 4.15 順序迭代合并后的排序迭代對象
- 4.16 迭代器代替while無限循環
- 第五章:文件與IO
- 5.1 讀寫文本數據
- 5.2 打印輸出至文件中
- 5.3 使用其他分隔符或行終止符打印
- 5.4 讀寫字節數據
- 5.5 文件不存在才能寫入
- 5.6 字符串的I/O操作
- 5.7 讀寫壓縮文件
- 5.8 固定大小記錄的文件迭代
- 5.9 讀取二進制數據到可變緩沖區中
- 5.10 內存映射的二進制文件
- 5.11 文件路徑名的操作
- 5.12 測試文件是否存在
- 5.13 獲取文件夾中的文件列表
- 5.14 忽略文件名編碼
- 5.15 打印不合法的文件名
- 5.16 增加或改變已打開文件的編碼
- 5.17 將字節寫入文本文件
- 5.18 將文件描述符包裝成文件對象
- 5.19 創建臨時文件和文件夾
- 5.20 與串行端口的數據通信
- 5.21 序列化Python對象
- 第六章:數據編碼和處理
- 6.1 讀寫CSV數據
- 6.2 讀寫JSON數據
- 6.3 解析簡單的XML數據
- 6.4 增量式解析大型XML文件
- 6.5 將字典轉換為XML
- 6.6 解析和修改XML
- 6.7 利用命名空間解析XML文檔
- 6.8 與關系型數據庫的交互
- 6.9 編碼和解碼十六進制數
- 6.10 編碼解碼Base64數據
- 6.11 讀寫二進制數組數據
- 6.12 讀取嵌套和可變長二進制數據
- 6.13 數據的累加與統計操作
- 第七章:函數
- 7.1 可接受任意數量參數的函數
- 7.2 只接受關鍵字參數的函數
- 7.3 給函數參數增加元信息
- 7.4 返回多個值的函數
- 7.5 定義有默認參數的函數
- 7.6 定義匿名或內聯函數
- 7.7 匿名函數捕獲變量值
- 7.8 減少可調用對象的參數個數
- 7.9 將單方法的類轉換為函數
- 7.10 帶額外狀態信息的回調函數
- 7.11 內聯回調函數
- 7.12 訪問閉包中定義的變量
- 第八章:類與對象
- 8.1 改變對象的字符串顯示
- 8.2 自定義字符串的格式化
- 8.3 讓對象支持上下文管理協議
- 8.4 創建大量對象時節省內存方法
- 8.5 在類中封裝屬性名
- 8.6 創建可管理的屬性
- 8.7 調用父類方法
- 8.8 子類中擴展property
- 8.9 創建新的類或實例屬性
- 8.10 使用延遲計算屬性
- 8.11 簡化數據結構的初始化
- 8.12 定義接口或者抽象基類
- 8.13 實現數據模型的類型約束
- 8.14 實現自定義容器
- 8.15 屬性的代理訪問
- 8.16 在類中定義多個構造器
- 8.17 創建不調用init方法的實例
- 8.18 利用Mixins擴展類功能
- 8.19 實現狀態對象或者狀態機
- 8.20 通過字符串調用對象方法
- 8.21 實現訪問者模式
- 8.22 不用遞歸實現訪問者模式
- 8.23 循環引用數據結構的內存管理
- 8.24 讓類支持比較操作
- 8.25 創建緩存實例
- 第九章:元編程
- 9.1 在函數上添加包裝器
- 9.2 創建裝飾器時保留函數元信息
- 9.3 解除一個裝飾器
- 9.4 定義一個帶參數的裝飾器
- 9.5 可自定義屬性的裝飾器
- 9.6 帶可選參數的裝飾器
- 9.7 利用裝飾器強制函數上的類型檢查
- 9.8 將裝飾器定義為類的一部分
- 9.9 將裝飾器定義為類
- 9.10 為類和靜態方法提供裝飾器
- 9.11 裝飾器為被包裝函數增加參數
- 9.12 使用裝飾器擴充類的功能
- 9.13 使用元類控制實例的創建
- 9.14 捕獲類的屬性定義順序
- 9.15 定義有可選參數的元類
- 9.16 *args和**kwargs的強制參數簽名
- 9.17 在類上強制使用編程規約
- 9.18 以編程方式定義類
- 9.19 在定義的時候初始化類的成員
- 9.20 利用函數注解實現方法重載
- 9.21 避免重復的屬性方法
- 9.22 定義上下文管理器的簡單方法
- 9.23 在局部變量域中執行代碼
- 9.24 解析與分析Python源碼
- 9.25 拆解Python字節碼
- 第十章:模塊與包
- 10.1 構建一個模塊的層級包
- 10.2 控制模塊被全部導入的內容
- 10.3 使用相對路徑名導入包中子模塊
- 10.4 將模塊分割成多個文件
- 10.5 利用命名空間導入目錄分散的代碼
- 10.6 重新加載模塊
- 10.7 運行目錄或壓縮文件
- 10.8 讀取位于包中的數據文件
- 10.9 將文件夾加入到sys.path
- 10.10 通過字符串名導入模塊
- 10.11 通過導入鉤子遠程加載模塊
- 10.12 導入模塊的同時修改模塊
- 10.13 安裝私有的包
- 10.14 創建新的Python環境
- 10.15 分發包
- 第十一章:網絡與Web編程
- 11.1 作為客戶端與HTTP服務交互
- 11.2 創建TCP服務器
- 11.3 創建UDP服務器
- 11.4 通過CIDR地址生成對應的IP地址集
- 11.5 生成一個簡單的REST接口
- 11.6 通過XML-RPC實現簡單的遠程調用
- 11.7 在不同的Python解釋器之間交互
- 11.8 實現遠程方法調用
- 11.9 簡單的客戶端認證
- 11.10 在網絡服務中加入SSL
- 11.11 進程間傳遞Socket文件描述符
- 11.12 理解事件驅動的IO
- 11.13 發送與接收大型數組
- 第十二章:并發編程
- 12.1 啟動與停止線程
- 12.2 判斷線程是否已經啟動
- 12.3 線程間的通信
- 12.4 給關鍵部分加鎖
- 12.5 防止死鎖的加鎖機制
- 12.6 保存線程的狀態信息
- 12.7 創建一個線程池
- 12.8 簡單的并行編程
- 12.9 Python的全局鎖問題
- 12.10 定義一個Actor任務
- 12.11 實現消息發布/訂閱模型
- 12.12 使用生成器代替線程
- 12.13 多個線程隊列輪詢
- 12.14 在Unix系統上面啟動守護進程
- 第十三章:腳本編程與系統管理
- 13.1 通過重定向/管道/文件接受輸入
- 13.2 終止程序并給出錯誤信息
- 13.3 解析命令行選項
- 13.4 運行時彈出密碼輸入提示
- 13.5 獲取終端的大小
- 13.6 執行外部命令并獲取它的輸出
- 13.7 復制或者移動文件和目錄
- 13.8 創建和解壓壓縮文件
- 13.9 通過文件名查找文件
- 13.10 讀取配置文件
- 13.11 給簡單腳本增加日志功能
- 13.12 給內庫增加日志功能
- 13.13 記錄程序執行的時間
- 13.14 限制內存和CPU的使用量
- 13.15 啟動一個WEB瀏覽器
- 第十四章:測試調試和異常
- 14.1 測試輸出到標準輸出上
- 14.2 在單元測試中給對象打補丁
- 14.3 在單元測試中測試異常情況
- 14.4 將測試輸出用日志記錄到文件中
- 14.5 忽略或者期望測試失敗
- 14.6 處理多個異常
- 14.7 捕獲所有異常
- 14.8 創建自定義異常
- 14.9 捕獲異常后拋出另外的異常
- 14.10 重新拋出最后的異常
- 14.11 輸出警告信息
- 14.12 調試基本的程序崩潰錯誤
- 14.13 給你的程序做基準測試
- 14.14 讓你的程序跑的更快
- 第十五章:C語言擴展
- 15.1 使用ctypes訪問C代碼
- 15.2 簡單的C擴展模塊
- 15.3 一個操作數組的擴展函數
- 15.4 在C擴展模塊中操作隱形指針
- 15.5 從擴張模塊中定義和導出C的API
- 15.6 從C語言中調用Python代碼
- 15.7 從C擴展中釋放全局鎖
- 15.8 C和Python中的線程混用
- 15.9 用WSIG包裝C代碼
- 15.10 用Cython包裝C代碼
- 15.11 用Cython寫高性能的數組操作
- 15.12 將函數指針轉換為可調用對象
- 15.13 傳遞NULL結尾的字符串給C函數庫
- 15.14 傳遞Unicode字符串給C函數庫
- 15.15 C字符串轉換為Python字符串
- 15.16 不確定編碼格式的C字符串
- 15.17 傳遞文件名給C擴展
- 15.18 傳遞已打開的文件給C擴展
- 15.19 從C語言中讀取類文件對象
- 15.20 處理C語言中的可迭代對象
- 15.21 診斷分析代碼錯誤
- 附錄A
- 關于譯者
- Roadmap