Python編程輕鬆進階 Beyond the Basic Stuff with Python: Best Practices for Writing Clean Code

Al Sweigart 譯 張望

商品描述

本書分為三大部分,共計17章。
第#一部分(第1~2章)介紹了基礎知識,包括如何配置開發環境和在網上尋求幫助。
第二部分(第3~14章)介紹了Python編程的#佳實踐、實用工具和技巧,
不僅涵蓋瞭如何編寫高質量的Python代碼、什麼是高#級的Python語法、
如何使用專業開發#者所用的命令行工具,還介紹了性能測量和大O算法分析,並用遊戲實例演示了什麼是#佳實踐。
第三部分(第15~17章)介紹了面向對象的Python,
內容包括如何編寫類、什麼是類的繼承,以及Python獨有的面向對像功能。

作者簡介

Al Sweigart
是Python軟件基金會Fellow,在Python社區頗具影響力,曾受邀在世界各地的Python大會上做主題演講。
他的Python入門書《Python編程快速上手》在全球範圍內銷售超過70萬冊。
除了寫作Python書,阿爾還在線授課。
他的Python在線課程已覆蓋100萬+學生。

【譯者簡介】 
張望
畢業於重慶大學,曾就職於騰訊看點、微信支付等部門,
現就職於騰訊音樂集團商業廣告部,負責廣告投放等商業化系統的建設。
騰訊開源項目WeTERM PMC成員,開源項目PyWebIO貢獻者。

目錄大綱

目錄
第1部分起步
第1章處理錯誤和尋求幫助 2
1.1 如何理解Python錯誤信息 2
1.1.1 檢查回溯信息 2
1.1.2 搜索錯誤信息 5
1.2 借助linter 避免錯誤 7
1.3 如何尋求編程幫助 8
1.3.1 預先提供信息以避免反复補充 9
1.3.2 以實際問題的形式陳述問題 9
1.3.3 在合適的網站上提出你的問題 9
1.3.4 在標題中概述你的問題 9
1.3.5 說明代碼的預期目的 9
1.3.6 包含完整的錯誤信息 9
1.3.7 分享全部代碼 10
1.3.8 通過適當的格式化增強代碼可讀性 11
1.3.9 告訴幫忙者已經嘗試過的方法 11
1.3.10 描述你的設置信息12
1.4 樣例:如何尋求幫助 12
1.5 小結13
第2章環境設置和命令行 14
2.1 文件系統 14
2.1.1 Python中的路徑 15
2.1.2 主目錄 16
2.1.3 當前工作目錄16
2.1.4 絕#對路徑和相對路徑 17
2.2 程序和進程 18
2.3 命令行 18
2.3.1 打開終端窗口 19
2.3.2 使用命令行運行程序 20
2.3.3 使用命令行參數 21
2.3.4 在命令行中使用-c 運行Python代碼 22
2.3.5 從命令行運行Python 程序 23
2.3.6 運行py.exe 程序23
2.3.7 在Python 程序中運行命令 23
2.3.8 使用Tab 補全命令減少輸入量 24
2.3.9 查看歷史命令 24
2.3.10 使用常用命令 25
2.4 環境變量和PATH 32
2.4.1 查看環境變量 32
2.4.2 使用PATH 環境變量 33
2.4.3 更改命令行的PATH 環境變量 34
2.4.4 在Windows 上將文件夾永#久添加到PATH 34
2.4.5 在macOS 和Linux 上將文件夾永#久添加到PATH 35
2.5 不借助命令行運行Python 程序 36
2.5.1 在Windows 上運行Python程序 36
2.5.2 在macOS 上運行Python 程序 37
2.5.3 在Ubuntu Linux 上運行Python程序 37
2.6 小結 38
第二部分#佳實踐、工具和技巧
第3章使用Black 進行代碼格式化 40
3.1 讓程序員招人煩的錯誤做法 40
3.2 風格指南和PEP 8 41
3.3 水平間距41
3.3.1 使用空格進行縮進41
3.3.2 行內間距 42
3.4 垂直間距45
3.4.1 垂直間距示例 46
3.4.2 垂直間距的#佳實踐 46
3.5 Black:毫不妥協的代碼格式化工具 48
3.5.1 安裝Black 48
3.5.2 在命令行中運行Black 48
3.5.3 對部分代碼禁用Black 51
3.6 小結 52
第4章選擇易懂的名稱 53
4.1 命名風格 54
4.2 PEP 8 的命名風格 54
4.3 適當的名稱長度 54
4.3.1 太短的名稱 55
4.3.2 太長的名稱 56
4.4 起易於搜索的名稱 57
4.5 避免笑話、雙關語和需要文化背景才能理解的詞彙57
4.6 不要覆蓋內置名稱 58
4.7 史上#差的變量名 59
4.8 小結 59
第5章揪出代碼的壞味道61
5.1 重複的代碼 61
5.2 魔數 63
5.3 註釋掉的代碼和死代碼65
5.4 打印調試 67
5.5 帶有數字後綴的變量 67
5.6 本該是函數或者模塊的類 68
5.7 嵌套列表解析式 69
5.8 空的except塊和糟糕的錯誤信息 70
5.9 代碼壞味道的謬誤 71
5.9.1 謬誤:函數應該僅在末尾處有一個return語句 72
5.9.2 謬誤:函數#多只能有一個try語句 72
5.9.3 謬誤:使用flag參數不好 73
5.9.4 謬誤:全局變量不好 73
5.9.5 謬誤:註釋是不必要的74
5.10 小結 75
第6章編寫Python 風格的代碼 76
6.1 Python 之禪76
6.2 學著喜歡強制縮進 79
6.3 使用timeit模塊衡量性能 80
6.4 常被誤用的語法 82
6.4.1 使用enumerate()而不是range() 82
6.4.2 使用with 語句代替open()和close() 83
6.4.3 用is 跟N0ne 做比較而不用== 84
6.5 格式化字符串 84
6.5.1 如果字符串有很多反斜杠,請使用原始字符串 84
6.5.2 使用f-string 格式化字符串 85
6.6 製作列表的淺副本 86
6.7 以Python 風格使用字典 87
6.7.1 在字典中使用get()和setdefault() 87
6.7.2 使用collections.defaultdict()設置默認值 89
6.7.3 使用字典代替switch 語句89
6.8 條件表達式:Python“醜陋”的三元運算符 90
6.9 處理變量的值 92
6.9.1 鍊式賦值和比較運算符 92
6.9.2 驗證變量是否為多個值中的一個 93
6.10 小結 93
第7章編程術語 95
7.1 定義 95
7.1.1 作為語言的Python 和作為解釋器的Python 96
7.1.2 垃圾回收 96
7.1.3 字面量 97
7.1.4 關鍵字98
7.1.5 對象、值、實例和身份98
7.1.6 項 101
7.1.7 可變和不可變 101
7.1.8 索引、鍵和哈希值 104
7.1.9 容器、序列、映射和集合類型 106
7.1.10 特殊方法 107
7.1.11 模塊和包 108
7.1.12 可調用對象和頭等對象 108
7.2 經常被混淆的術語 109
7.2.1 語句和表達式 109
7.2.2 塊、子句和主體 110
7.2.3 變量和特性111
7.2.4 函數和方法111
7.2.5 可迭代對象和迭代器 112
7.2.6 語法錯誤、運行時錯誤和語義錯誤 113
7.2.7 形參和實參 115
7.2.8 顯式類型轉換和隱式類型轉換 115
7.2.9 屬性和特性 115
7.2.10 字節碼和機器碼 116
7.2.11 腳本和程序,以及腳本語言和編程語言 116
7.2.12 庫、框架、SDK、引擎、API 117
7.3 小結 117
第8章常見的Python陷阱 119
8.1 循環列表的同時不要增刪其中的元素 119
8.2 複製可變值時務必使用copy.copy()和copy.deepcopy() 125
8.3 不要用可變值作為默認參數 128
8.4 不要通過字符串連接創建字符串 130
8.5 不要指望sort()按照字母順序排序131
8.6 不要假設浮點數是完全準確的 132
8.7 不要使用鍊式!=運算符 135
8.8 不要忘記在僅有一項的元組中添加逗號 135
8.9 小結 136
第9章Python的奇特難懂之處 137
9.1 為什麼256 是256,而257 不是257 137
9.2 字符串駐留 138
9.3 假的Python 增量運算符和減量運算符 139
9.4 傳遞空列表給all() 141
9.5 布爾值是整數值 141
9.6 鍊式使用多種運算符 143
9.7 Python 的反重力特性 143
9.8 小結 144
第10章編寫高效的函數 145
10.1 函數名 145
10.2 函數大小的權衡 146
10.3 函數的形參和實參 148
10.3.1 默認參數 149
10.3.2 使用*和**向函數傳參 149
10.3.3 使用*創建可變參數函數150
10.3.4 使用**創建可變參數函數 153
10.3.5 使用*和**創建包裝函數154
10.4 函數式編程 155
10.4.1 副作用155
10.4.2 高階函數 157
10.4.3 lambda 函數 157
10.4.4 在列表推導式中進行映射和過濾 158
10.5 返回值的數據類型應該不變 159
10.6 拋出異常和返回錯誤碼 161
10.7 小結 162
第11章註釋、文檔字符串和類型提示 163
11.1 註釋164
11.1.1 註釋風格164
11.1.2 內聯註釋 165
11.1.3 說明性的註釋166
11.1.4 總結性的註釋166
11.1.5 “經驗之談”的註釋167
11.1.6 法律註釋 167
11.1.7 註釋的專業性 167
11.1.8 代碼標籤和TODO 註釋168
11.1.9 神奇的註釋和源文件編碼 168
11.2 文檔字符串 169
11.3 類型提示 171
11.3.1 使用靜態分析器172
11.3.2 為多種類型設置類型提示 174
11.3.3 為列表、字典等設置類型提示 176
11.3.4 通過註釋向後移植類型提示 176
11.4 小結177
第12章通過Git管理項目 . 179
12.1 Git 提交和倉庫 179
12.2 使用Cookiecutter新建Python項目180
12.3 安裝Git 182
12.3.1 配置Git 用戶名和電子郵件182
12.3.2 安裝GUI Git 工具182
12.4 Git 的工作流程 183
12.4.1 Git 是如何追踪文件狀態的 184
12.4.2 為什麼要暫存文件 185
12.5 在計算機上創建Git 倉庫 185
12.5.1 添加供Git 追踪的文件 187
12.5.2 忽略倉庫中的文件 188
12.5.3 提交修改189
12.5.4 從倉庫中刪除文件 193
12.5.5 重命名和移動倉庫中的文件 194
12.6 查看提交日誌195
12.7 恢復歷史修改196
12.7.1 撤銷未提交的本地修改 196
12.7.2 取消暫存的文件197
12.7.3 回滾近期的提交 197
12.7.4 回滾到單個文件的某次提交 198
12.7.5 重寫提交歷史 199
12.8 GitHub 和git推送命令 199
12.8.1 將一個已存在的倉庫推送到GitHub 200
12.8.2 克隆已存在的GitHub倉庫201
12.9 小結 202
第13章性能測量和大O算法分析 203
13.1 timeit模塊 203
13.2 cProfile分析器 206
13.3 大O算法分析 208
13.4 大O階 208
13.4.1 使用書架打比方描述大O階 209
13.4.2 大O 測量的是#壞情況 212
13.5 確定代碼的大O 階 214
13.5.1 為什麼低階項和係數不重要 215
13.5.2 大O 分析實例216
13.5.3 常見函數調用的大O 階 219
13.5.4 一眼看出大O 階 220
13.5.5 當n 很小時,大O並不重要,而n通常都很小 221
13.6 小結 . 221
第14章項目實戰 222
14.1 漢諾塔. 222
14.1.1 輸出 223
14.1.2 源代碼 224
14.1.3 編寫代碼 227
14.2 四子棋 233
14.2.1 輸出 233
14.2.2 源代碼 234
14.2.3 編寫代碼238
14.3 小結 245
第三部分面向對象的Python
第15章面向對象編程和類 248
15.1 拿現實世界打比方:填寫表格248
15.2 基於類創建對象 250
15.3 創建一個簡單的類——WizCoin 251
15.3.1 方法__init__()和self 253
15.3.2 特性 254
15.3.3 私有特性和私有方法 255
15.4 函數type()和特性__qualname__ 257
15.5 非OOP 和OOP 的例子:井字棋 258
15.6 為現實世界設計類是一件難事兒 263
15.7 小結 263
第16章面向對象編程和繼承 265
16.1 繼承的原理 265
16.1.1 重寫方法 267
16.1.2 super()函數 269
16.1.3 傾向於組合而非繼承271
16.1.4 繼承的缺點272
16.2 函數isinstance()和issubclass() 274
16.3 類方法 275
16.4 類特性 277
16.5 靜態方法 278
16.6 何時應該使用類和靜態的面向對象特性 278
16.7 面向對象的行話 279
16.7.1 封裝 279
16.7.2 多態性 279
16.8 何時不應該使用繼承279
16.9 多重繼承 280
16.10 方法解析順序 282
16.11 小結 283
第17章Python 風格的面向對象編程:屬性和魔術方法 285
17.1 屬性 285
17.1.1 將特性轉換為屬性286
17.1.2 使用setter 驗證數據288
17.1.3 只讀屬性 290
17.1.4 什麼時候應該使用屬性 291
17.2 Python 的魔術方法 291
17.2.1 字符串表示魔術方法 292
17.2.2 數值魔術方法294
17.2.3 反射數值魔術方法 297
17.2.4 原地魔術方法299
17.2.5 比較魔術方法 301
17.3 小結 305