本書(shū)分為三大部分,共計(jì)17章。第一部分(第1~2章)介紹了基礎(chǔ)知識(shí),包括如何配置開(kāi)發(fā)環(huán)境和在網(wǎng)上尋求幫助。第二部分(第3~14章)介紹了Python編程的最佳實(shí)踐、實(shí)用工具和技巧,不僅涵蓋了如何編寫(xiě)高質(zhì)量的Python代碼、什么是高級(jí)的Python語(yǔ)法、如何使用專(zhuān)業(yè)開(kāi)發(fā)者所用的命令行工具,還介紹了性能測(cè)量和大O算法分析,并用游戲?qū)嵗菔玖耸裁词亲罴褜?shí)踐。第三部分(第15~17章)介紹了面向?qū)ο蟮腜ython,內(nèi)容包括如何編寫(xiě)類(lèi)、什么是類(lèi)的繼承,以及Python獨(dú)有的面向?qū)ο蠊δ堋?
* 《Python編程快速上手》的作者阿爾·斯維加特又一力作
* 《python編程從入門(mén)到實(shí)踐》讀者的進(jìn)階Python推薦讀物
* 逐步可視化代碼執(zhí)行過(guò)程,助你編寫(xiě)規(guī)范、整潔的Python代碼
* 通過(guò)益智游戲了解代碼底層邏輯,像職業(yè)程序員一樣使用Python
在學(xué)習(xí)Python的旅程中,你是否正在“絕望的沙漠”里徘徊?你已經(jīng)學(xué)完了基礎(chǔ)教程,卻徘徊于不同的學(xué)習(xí)材料之間,感覺(jué)自己毫無(wú)長(zhǎng)進(jìn)。本書(shū)是“沙漠里的那片綠洲”。
作為《Python編程快速上手》的姊妹篇,本書(shū)專(zhuān)為想達(dá)到職業(yè)程序員水平卻問(wèn)路無(wú)門(mén)的人而寫(xiě)。作者擁有豐富的Python教學(xué)經(jīng)驗(yàn),所寫(xiě)內(nèi)容既翔實(shí)細(xì)致,又深入淺出。你將通過(guò)三個(gè)方面實(shí)現(xiàn)從“快速上手”到“輕松進(jìn)階”的躍遷:解決初級(jí)進(jìn)階會(huì)遇到的重重困難;掌握Python編程的實(shí)踐、工具和技巧;理解面向?qū)ο蟮腜ython。
【作者簡(jiǎn)介】
阿爾·斯維加特(Al Sweigart)是Python軟件基金會(huì)Fellow,在Python社區(qū)頗具影響力,曾受邀在世界各地的Python大會(huì)上做主題演講。他的Python入門(mén)書(shū)《Python編程快速上手》在全球范圍內(nèi)銷(xiāo)售超過(guò)70萬(wàn)冊(cè)。除了寫(xiě)作Python書(shū),阿爾還在線(xiàn)授課。他的Python在線(xiàn)課程已覆蓋100萬(wàn)+學(xué)生。
【譯者簡(jiǎn)介】
張望
畢業(yè)于重慶大學(xué),曾就職于騰訊看點(diǎn)、微信支付等部門(mén),現(xiàn)就職于騰訊音樂(lè)集團(tuán)商業(yè)廣告部,負(fù)責(zé)廣告投放等商業(yè)化系統(tǒng)的建設(shè)。騰訊開(kāi)源項(xiàng)目WeTERM PMC成員,開(kāi)源項(xiàng)目PyWebIO貢獻(xiàn)者。
第 一部分 起步
第 1章 處理錯(cuò)誤和尋求幫助 2
1.1 如何理解Python錯(cuò)誤信息 2
1.1.1 檢查回溯信息 2
1.1.2 搜索錯(cuò)誤信息 5
1.2 借助linter 避免錯(cuò)誤 7
1.3 如何尋求編程幫助 8
1.3.1 預(yù)先提供信息以避免反復(fù)補(bǔ)充 9
1.3.2 以實(shí)際問(wèn)題的形式陳述問(wèn)題 9
1.3.3 在合適的網(wǎng)站上提出你的問(wèn)題 9
1.3.4 在標(biāo)題中概述你的問(wèn)題 9
1.3.5 說(shuō)明代碼的預(yù)期目的 9
1.3.6 包含完整的錯(cuò)誤信息 9
1.3.7 分享全部代碼 10
1.3.8 通過(guò)適當(dāng)?shù)母袷交鰪?qiáng)代碼可讀性 11
1.3.9 告訴幫忙者已經(jīng)嘗試過(guò)的方法 11
1.3.10 描述你的設(shè)置信息 12
1.4 樣例:如何尋求幫助 12
1.5 小結(jié) 13
第 2章 環(huán)境設(shè)置和命令行 14
2.1 文件系統(tǒng) 14
2.1.1 Python中的路徑 15
2.1.2 主目錄 16
2.1.3 當(dāng)前工作目錄 16
2.1.4 絕對(duì)路徑和相對(duì)路徑 17
2.2 程序和進(jìn)程 18
2.3 命令行 18
2.3.1 打開(kāi)終端窗口 19
2.3.2 使用命令行運(yùn)行程序 20
2.3.3 使用命令行參數(shù) 21
2.3.4 在命令行中使用-c 運(yùn)行Python代碼 22
2.3.5 從命令行運(yùn)行Python 程序 23
2.3.6 運(yùn)行py.exe 程序 23
2.3.7 在Python 程序中運(yùn)行命令 23
2.3.8 使用Tab 補(bǔ)全命令減少輸入量 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 不借助命令行運(yùn)行Python 程序 36
2.5.1 在Windows 上運(yùn)行Python程序 36
2.5.2 在macOS 上運(yùn)行Python 程序 37
2.5.3 在Ubuntu Linux 上運(yùn)行Python程序 37
2.6 小結(jié) 38
第二部分 最佳實(shí)踐、工具和技巧
第3章 使用Black 進(jìn)行代碼格式化 40
3.1 讓程序員招人煩的錯(cuò)誤做法 40
3.2 風(fēng)格指南和PEP 8 41
3.3 水平間距 41
3.3.1 使用空格進(jìn)行縮進(jìn) 41
3.3.2 行內(nèi)間距 42
3.4 垂直間距 45
3.4.1 垂直間距示例 46
3.4.2 垂直間距的最佳實(shí)踐 46
3.5 Black:毫不妥協(xié)的代碼格式化工具 48
3.5.1 安裝Black 48
3.5.2 在命令行中運(yùn)行Black 48
3.5.3 對(duì)部分代碼禁用Black 51
3.6 小結(jié) 52
第4章 選擇易懂的名稱(chēng) 53
4.1 命名風(fēng)格 54
4.2 PEP 8 的命名風(fēng)格 54
4.3 適當(dāng)?shù)拿Q(chēng)長(zhǎng)度 54
4.3.1 太短的名稱(chēng) 55
4.3.2 太長(zhǎng)的名稱(chēng) 56
4.4 起易于搜索的名稱(chēng) 57
4.5 避免笑話(huà)、雙關(guān)語(yǔ)和需要文化背景才能理解的詞匯 57
4.6 不要覆蓋內(nèi)置名稱(chēng) 58
4.7 史上最差的變量名 59
4.8 小結(jié) 59
第5章 揪出代碼的壞味道 61
5.1 重復(fù)的代碼 61
5.2 魔數(shù) 63
5.3 注釋掉的代碼和死代碼 65
5.4 打印調(diào)試 67
5.5 帶有數(shù)字后綴的變量 67
5.6 本該是函數(shù)或者模塊的類(lèi) 68
5.7 嵌套列表解析式 69
5.8 空的except塊和糟糕的錯(cuò)誤信息 70
5.9 代碼壞味道的謬誤 71
5.9.1 謬誤:函數(shù)應(yīng)該僅在末尾處有一個(gè)return語(yǔ)句 72
5.9.2 謬誤:函數(shù)最多只能有一個(gè)try語(yǔ)句 72
5.9.3 謬誤:使用flag參數(shù)不好 73
5.9.4 謬誤:全局變量不好 73
5.9.5 謬誤:注釋是不必要的 74
5.10 小結(jié) 75
第6章 編寫(xiě)Python 風(fēng)格的代碼 76
6.1 Python 之禪 76
6.2 學(xué)著喜歡強(qiáng)制縮進(jìn) 79
6.3 使用timeit模塊衡量性能 80
6.4 常被誤用的語(yǔ)法 82
6.4.1 使用enumerate()而不是range() 82
6.4.2 使用with 語(yǔ)句代替open()和close() 83
6.4.3 用is 跟None 做比較而不用== 84
6.5 格式化字符串 84
6.5.1 如果字符串有很多反斜杠,請(qǐng)使用原始字符串 84
6.5.2 使用f-string 格式化字符串 85
6.6 制作列表的淺副本 86
6.7 以Python 風(fēng)格使用字典 87
6.7.1 在字典中使用get()和setdefault() 87
6.7.2 使用collections.defaultdict()設(shè)置默認(rèn)值 89
6.7.3 使用字典代替switch 語(yǔ)句 89
6.8 條件表達(dá)式:Python“丑陋”的三元運(yùn)算符 90
6.9 處理變量的值 92
6.9.1 鏈?zhǔn)劫x值和比較運(yùn)算符 92
6.9.2 驗(yàn)證變量是否為多個(gè)值中的一個(gè) 93
6.10 小結(jié) 93
第7章 編程術(shù)語(yǔ) 95
7.1 定義 95
7.1.1 作為語(yǔ)言的Python 和作為解釋器的Python 96
7.1.2 垃圾回收 96
7.1.3 字面量 97
7.1.4 關(guān)鍵字 98
7.1.5 對(duì)象、值、實(shí)例和身份 98
7.1.6 項(xiàng) 101
7.1.7 可變和不可變 101
7.1.8 索引、鍵和哈希值 104
7.1.9 容器、序列、映射和集合類(lèi)型 106
7.1.10 特殊方法 107
7.1.11 模塊和包 108
7.1.12 可調(diào)用對(duì)象和頭等對(duì)象 108
7.2 經(jīng)常被混淆的術(shù)語(yǔ) 109
7.2.1 語(yǔ)句和表達(dá)式 109
7.2.2 塊、子句和主體 110
7.2.3 變量和特性 111
7.2.4 函數(shù)和方法 111
7.2.5 可迭代對(duì)象和迭代器 112
7.2.6 語(yǔ)法錯(cuò)誤、運(yùn)行時(shí)錯(cuò)誤和語(yǔ)義錯(cuò)誤 113
7.2.7 形參和實(shí)參 115
7.2.8 顯式類(lèi)型轉(zhuǎn)換和隱式類(lèi)型轉(zhuǎn)換 115
7.2.9 屬性和特性 115
7.2.10 字節(jié)碼和機(jī)器碼 116
7.2.11 腳本和程序,以及腳本語(yǔ)言和編程語(yǔ)言 116
7.2.12 庫(kù)、框架、SDK、引擎、API 117
7.3 小結(jié) 117
第8章 常見(jiàn)的Python陷阱 119
8.1 循環(huán)列表的同時(shí)不要增刪其中的元素 119
8.2 復(fù)制可變值時(shí)務(wù)必使用copy.copy()和copy.deepcopy() 125
8.3 不要用可變值作為默認(rèn)參數(shù) 128
8.4 不要通過(guò)字符串連接創(chuàng)建字符串 130
8.5 不要指望sort()按照字母順序排序 131
8.6 不要假設(shè)浮點(diǎn)數(shù)是完全準(zhǔn)確的 132
8.7 不要使用鏈?zhǔn)?=運(yùn)算符 135
8.8 不要忘記在僅有一項(xiàng)的元組中添加逗號(hào) 135
8.9 小結(jié) 136
第9章 Python的奇特難懂之處 137
9.1 為什么256 是256,而257 不是257 137
9.2 字符串駐留 138
9.3 假的Python 增量運(yùn)算符和減量運(yùn)算符 139
9.4 傳遞空列表給all() 141
9.5 布爾值是整數(shù)值 141
9.6 鏈?zhǔn)绞褂枚喾N運(yùn)算符 143
9.7 Python 的反重力特性 143
9.8 小結(jié) 144
第 10章 編寫(xiě)高效的函數(shù) 145
10.1 函數(shù)名 145
10.2 函數(shù)大小的權(quán)衡 146
10.3 函數(shù)的形參和實(shí)參 148
10.3.1 默認(rèn)參數(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 在列表推導(dǎo)式中進(jìn)行映射和過(guò)濾 158
10.5 返回值的數(shù)據(jù)類(lèi)型應(yīng)該不變 159
10.6 拋出異常和返回錯(cuò)誤碼 161
10.7 小結(jié) 162
第 11章 注釋、文檔字符串和類(lèi)型提示 163
11.1 注釋 164
11.1.1 注釋風(fēng)格 164
11.1.2 內(nèi)聯(lián)注釋 165
11.1.3 說(shuō)明性的注釋 166
11.1.4 總結(jié)性的注釋 166
11.1.5 “經(jīng)驗(yàn)之談”的注釋 167
11.1.6 法律注釋 167
11.1.7 注釋的專(zhuān)業(yè)性 167
11.1.8 代碼標(biāo)簽和TODO 注釋 168
11.1.9 神奇的注釋和源文件編碼 168
11.2 文檔字符串 169
11.3 類(lèi)型提示 171
11.3.1 使用靜態(tài)分析器 172
11.3.2 為多種類(lèi)型設(shè)置類(lèi)型提示 174
11.3.3 為列表、字典等設(shè)置類(lèi)型提示 176
11.3.4 通過(guò)注釋向后移植類(lèi)型提示 176
11.4 小結(jié) 177
第 12章 通過(guò)Git管理項(xiàng)目 . 179
12.1 Git 提交和倉(cāng)庫(kù) 179
12.2 使用Cookiecutter新建Python項(xiàng)目 180
12.3 安裝Git 182
12.3.1 配置Git 用戶(hù)名和電子郵件 182
12.3.2 安裝GUI Git 工具 182
12.4 Git 的工作流程 183
12.4.1 Git 是如何追蹤文件狀態(tài)的 184
12.4.2 為什么要暫存文件 185
12.5 在計(jì)算機(jī)上創(chuàng)建Git 倉(cāng)庫(kù) 185
12.5.1 添加供Git 追蹤的文件 187
12.5.2 忽略倉(cāng)庫(kù)中的文件 188
12.5.3 提交修改 189
12.5.4 從倉(cāng)庫(kù)中刪除文件 193
12.5.5 重命名和移動(dòng)倉(cāng)庫(kù)中的文件 194
12.6 查看提交日志 195
12.7 恢復(fù)歷史修改 196
12.7.1 撤銷(xiāo)未提交的本地修改 196
12.7.2 取消暫存的文件 197
12.7.3 回滾近期的提交 197
12.7.4 回滾到單個(gè)文件的某次提交 198
12.7.5 重寫(xiě)提交歷史 199
12.8 GitHub 和git推送命令 199
12.8.1 將一個(gè)已存在的倉(cāng)庫(kù)推送到GitHub 200
12.8.2 克隆已存在的GitHub倉(cāng)庫(kù) 201
12.9 小結(jié) 202
第 13章 性能測(cè)量和大O算法分析 203
13.1 timeit模塊 203
13.2 cProfile分析器 206
13.3 大O算法分析 208
13.4 大O階 208
13.4.1 使用書(shū)架打比方描述大O階 209
13.4.2 大O 測(cè)量的是最壞情況 212
13.5 確定代碼的大O 階 214
13.5.1 為什么低階項(xiàng)和系數(shù)不重要 215
13.5.2 大O 分析實(shí)例 216
13.5.3 常見(jiàn)函數(shù)調(diào)用的大O 階 219
13.5.4 一眼看出大O 階 220
13.5.5 當(dāng)n 很小時(shí),大O并不重要,而n通常都很小 221
13.6 小結(jié) . 221
第 14章 項(xiàng)目實(shí)戰(zhàn) 222
14.1 漢諾塔 . 222
14.1.1 輸出 223
14.1.2 源代碼 224
14.1.3 編寫(xiě)代碼 227
14.2 四子棋 233
14.2.1 輸出 233
14.2.2 源代碼 234
14.2.3 編寫(xiě)代碼 238
14.3 小結(jié) 245
第三部分 面向?qū)ο蟮腜ython
第 15章 面向?qū)ο缶幊毯皖?lèi) 248
15.1 拿現(xiàn)實(shí)世界打比方:填寫(xiě)表格 248
15.2 基于類(lèi)創(chuàng)建對(duì)象 250
15.3 創(chuàng)建一個(gè)簡(jiǎn)單的類(lèi)——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)實(shí)世界設(shè)計(jì)類(lèi)是一件難事兒 263
15.7 小結(jié) 263
第 16章 面向?qū)ο缶幊毯屠^承 265
16.1 繼承的原理 265
16.1.1 重寫(xiě)方法 267
16.1.2 super()函數(shù) 269
16.1.3 傾向于組合而非繼承 271
16.1.4 繼承的缺點(diǎn) 272
16.2 函數(shù)isinstance()和issubclass() 274
16.3 類(lèi)方法 275
16.4 類(lèi)特性 277
16.5 靜態(tài)方法 278
16.6 何時(shí)應(yīng)該使用類(lèi)和靜態(tài)的面向?qū)ο筇匦? 278
16.7 面向?qū)ο蟮男性?huà) 279
16.7.1 封裝 279
16.7.2 多態(tài)性 279
16.8 何時(shí)不應(yīng)該使用繼承 279
16.9 多重繼承 280
16.10 方法解析順序 282
16.11 小結(jié) 283
第 17章 Python 風(fēng)格的面向?qū)ο缶幊蹋簩傩院湍g(shù)方法 285
17.1 屬性 285
17.1.1 將特性轉(zhuǎn)換為屬性 286
17.1.2 使用setter 驗(yàn)證數(shù)據(jù) 288
17.1.3 只讀屬性 290
17.1.4 什么時(shí)候應(yīng)該使用屬性 291
17.2 Python 的魔術(shù)方法 291
17.2.1 字符串表示魔術(shù)方法 292
17.2.2 數(shù)值魔術(shù)方法 294
17.2.3 反射數(shù)值魔術(shù)方法 297
17.2.4 原地魔術(shù)方法 299
17.2.5 比較魔術(shù)方法 301
17.3 小結(jié) 305