本書分為三大部分,共計17章。第一部分(第1~2章)介紹了基礎知識,包括如何配置開發(fā)環(huán)境和在網(wǎng)上尋求幫助。第二部分(第3~14章)介紹了Python編程的最佳實踐、實用工具和技巧,不僅涵蓋了如何編寫高質量的Python代碼、什么是高級的Python語法、如何使用專業(yè)開發(fā)者所用的命令行工具,還介紹了性能測量和大O算法分析,并用游戲實例演示了什么是最佳實踐。第三部分(第15~17章)介紹了面向對象的Python,內容包括如何編寫類、什么是類的繼承,以及Python獨有的面向對象功能。
* 《Python編程快速上手》的作者阿爾·斯維加特又一力作
* 《python編程從入門到實踐》讀者的進階Python推薦讀物
* 逐步可視化代碼執(zhí)行過程,助你編寫規(guī)范、整潔的Python代碼
* 通過益智游戲了解代碼底層邏輯,像職業(yè)程序員一樣使用Python
在學習Python的旅程中,你是否正在“絕望的沙漠”里徘徊?你已經(jīng)學完了基礎教程,卻徘徊于不同的學習材料之間,感覺自己毫無長進。本書是“沙漠里的那片綠洲”。
作為《Python編程快速上手》的姊妹篇,本書專為想達到職業(yè)程序員水平卻問路無門的人而寫。作者擁有豐富的Python教學經(jīng)驗,所寫內容既翔實細致,又深入淺出。你將通過三個方面實現(xiàn)從“快速上手”到“輕松進階”的躍遷:解決初級進階會遇到的重重困難;掌握Python編程的實踐、工具和技巧;理解面向對象的Python。
【作者簡介】
阿爾·斯維加特(Al Sweigart)是Python軟件基金會Fellow,在Python社區(qū)頗具影響力,曾受邀在世界各地的Python大會上做主題演講。他的Python入門書《Python編程快速上手》在全球范圍內銷售超過70萬冊。除了寫作Python書,阿爾還在線授課。他的Python在線課程已覆蓋100萬+學生。
【譯者簡介】
張望
畢業(yè)于重慶大學,曾就職于騰訊看點、微信支付等部門,現(xiàn)就職于騰訊音樂集團商業(yè)廣告部,負責廣告投放等商業(yè)化系統(tǒng)的建設。騰訊開源項目WeTERM PMC成員,開源項目PyWebIO貢獻者。
第 一部分 起步
第 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 在合適的網(wǎng)站上提出你的問題 9
1.3.4 在標題中概述你的問題 9
1.3.5 說明代碼的預期目的 9
1.3.6 包含完整的錯誤信息 9
1.3.7 分享全部代碼 10
1.3.8 通過適當?shù)母袷交鰪姶a可讀性 11
1.3.9 告訴幫忙者已經(jīng)嘗試過的方法 11
1.3.10 描述你的設置信息 12
1.4 樣例:如何尋求幫助 12
1.5 小結 13
第 2章 環(huán)境設置和命令行 14
2.1 文件系統(tǒng) 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 使用命令行參數(shù) 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 環(huán)境變量和PATH 32
2.4.1 查看環(huán)境變量 32
2.4.2 使用PATH 環(huán)境變量 33
2.4.3 更改命令行的PATH 環(huán)境變量 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:毫不妥協(xié)的代碼格式化工具 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 適當?shù)拿Q長度 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 魔數(shù) 63
5.3 注釋掉的代碼和死代碼 65
5.4 打印調試 67
5.5 帶有數(shù)字后綴的變量 67
5.6 本該是函數(shù)或者模塊的類 68
5.7 嵌套列表解析式 69
5.8 空的except塊和糟糕的錯誤信息 70
5.9 代碼壞味道的謬誤 71
5.9.1 謬誤:函數(shù)應該僅在末尾處有一個return語句 72
5.9.2 謬誤:函數(shù)最多只能有一個try語句 72
5.9.3 謬誤:使用flag參數(shù)不好 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 跟None 做比較而不用== 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 經(jīng)常被混淆的術語 109
7.2.1 語句和表達式 109
7.2.2 塊、子句和主體 110
7.2.3 變量和特性 111
7.2.4 函數(shù)和方法 111
7.2.5 可迭代對象和迭代器 112
7.2.6 語法錯誤、運行時錯誤和語義錯誤 113
7.2.7 形參和實參 115
7.2.8 顯式類型轉換和隱式類型轉換 115
7.2.9 屬性和特性 115
7.2.10 字節(jié)碼和機器碼 116
7.2.11 腳本和程序,以及腳本語言和編程語言 116
7.2.12 庫、框架、SDK、引擎、API 117
7.3 小結 117
第8章 常見的Python陷阱 119
8.1 循環(huán)列表的同時不要增刪其中的元素 119
8.2 復制可變值時務必使用copy.copy()和copy.deepcopy() 125
8.3 不要用可變值作為默認參數(shù) 128
8.4 不要通過字符串連接創(chuàng)建字符串 130
8.5 不要指望sort()按照字母順序排序 131
8.6 不要假設浮點數(shù)是完全準確的 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 布爾值是整數(shù)值 141
9.6 鏈式使用多種運算符 143
9.7 Python 的反重力特性 143
9.8 小結 144
第 10章 編寫高效的函數(shù) 145
10.1 函數(shù)名 145
10.2 函數(shù)大小的權衡 146
10.3 函數(shù)的形參和實參 148
10.3.1 默認參數(shù) 149
10.3.2 使用*和**向函數(shù)傳參 149
10.3.3 使用*創(chuàng)建可變參數(shù)函數(shù) 150
10.3.4 使用**創(chuàng)建可變參數(shù)函數(shù) 153
10.3.5 使用*和**創(chuàng)建包裝函數(shù) 154
10.4 函數(shù)式編程 155
10.4.1 副作用 155
10.4.2 高階函數(shù) 157
10.4.3 lambda 函數(shù) 157
10.4.4 在列表推導式中進行映射和過濾 158
10.5 返回值的數(shù)據(jù)類型應該不變 159
10.6 拋出異常和返回錯誤碼 161
10.7 小結 162
第 11章 注釋、文檔字符串和類型提示 163
11.1 注釋 164
11.1.1 注釋風格 164
11.1.2 內聯(lián)注釋 165
11.1.3 說明性的注釋 166
11.1.4 總結性的注釋 166
11.1.5 “經(jīng)驗之談”的注釋 167
11.1.6 法律注釋 167
11.1.7 注釋的專業(yè)性 167
11.1.8 代碼標簽和TODO 注釋 168
11.1.9 神奇的注釋和源文件編碼 168
11.2 文檔字符串 169
11.3 類型提示 171
11.3.1 使用靜態(tài)分析器 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 是如何追蹤文件狀態(tài)的 184
12.4.2 為什么要暫存文件 185
12.5 在計算機上創(chuàng)建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 為什么低階項和系數(shù)不重要 215
13.5.2 大O 分析實例 216
13.5.3 常見函數(shù)調用的大O 階 219
13.5.4 一眼看出大O 階 220
13.5.5 當n 很小時,大O并不重要,而n通常都很小 221
13.6 小結 . 221
第 14章 項目實戰(zhàn) 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 拿現(xiàn)實世界打比方:填寫表格 248
15.2 基于類創(chuàng)建對象 250
15.3 創(chuàng)建一個簡單的類——WizCoin 251
15.3.1 方法__init__()和self 253
15.3.2 特性 254
15.3.3 私有特性和私有方法 255
15.4 函數(shù)type()和特性__qualname__ 257
15.5 非OOP 和OOP 的例子:井字棋 258
15.6 為現(xiàn)實世界設計類是一件難事兒 263
15.7 小結 263
第 16章 面向對象編程和繼承 265
16.1 繼承的原理 265
16.1.1 重寫方法 267
16.1.2 super()函數(shù) 269
16.1.3 傾向于組合而非繼承 271
16.1.4 繼承的缺點 272
16.2 函數(shù)isinstance()和issubclass() 274
16.3 類方法 275
16.4 類特性 277
16.5 靜態(tài)方法 278
16.6 何時應該使用類和靜態(tài)的面向對象特性 278
16.7 面向對象的行話 279
16.7.1 封裝 279
16.7.2 多態(tài)性 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 驗證數(shù)據(jù) 288
17.1.3 只讀屬性 290
17.1.4 什么時候應該使用屬性 291
17.2 Python 的魔術方法 291
17.2.1 字符串表示魔術方法 292
17.2.2 數(shù)值魔術方法 294
17.2.3 反射數(shù)值魔術方法 297
17.2.4 原地魔術方法 299
17.2.5 比較魔術方法 301
17.3 小結 305