主要內(nèi)容 組織大型Python項(xiàng)目 實(shí)現(xiàn)合適的抽象級(jí)別 編寫(xiě)整潔并可重用的代碼 繼承和組合 測(cè)試和性能的注意事項(xiàng)
專業(yè)質(zhì)量的代碼不僅運(yùn)行時(shí)沒(méi)有錯(cuò)誤,而且整潔、易讀、易維護(hù)。想從一個(gè)有能力的Python程序員成長(zhǎng)為專業(yè)的開(kāi)發(fā)人員,讀者需要學(xué)習(xí)編碼風(fēng)格、應(yīng)用程序設(shè)計(jì)和開(kāi)發(fā)流程的行業(yè)標(biāo)準(zhǔn)。這正是本書(shū)的特色與要講解的內(nèi)容。
本書(shū)教會(huì)讀者設(shè)計(jì)和編寫(xiě)可理解、可維護(hù)和可擴(kuò)展的專業(yè)軟件。作者Dane Hillard是一位Python專業(yè)人士,幫助過(guò)許多開(kāi)發(fā)人員完成Python項(xiàng)目的設(shè)計(jì)和編寫(xiě),他知道在此過(guò)程中需要做些什么。他通過(guò)有用的示例和練習(xí),讓讀者明白在什么時(shí)機(jī),如何將代碼模塊化,如何通過(guò)降低復(fù)雜度來(lái)提高代碼質(zhì)量,以及為什么這樣做等。遵循這些核心原則,所編寫(xiě)的代碼將更易于自己和他人閱讀、維護(hù)和重用。
與我本人一樣,Python 誕生于1989 年12 月。雖然我在過(guò)去三十年里已經(jīng)取得了很大的成就,但是Python 的成功顯然更加顯著。
如今,越來(lái)越多的人使用Python 來(lái)完成數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)等方面的有趣事情。自從學(xué)習(xí)了Python,這門萬(wàn)事俱備的第二好語(yǔ)言實(shí)際上已經(jīng)成為我完成很多事情的。
在密歇根大學(xué)電子工程和計(jì)算機(jī)科學(xué)系學(xué)習(xí)期間,我有過(guò)一段相當(dāng)傳統(tǒng)的編程經(jīng)歷。那時(shí),課程主要集中在我次在學(xué)校外工作時(shí)繼續(xù)使用的C 和MATLAB 編程語(yǔ)言上。我在下一個(gè)職位上開(kāi)發(fā)了一些shell 腳本和SQL 腳本,用于處理生物信息學(xué)大數(shù)據(jù)。我也使用PHP 從零開(kāi)始在個(gè)人WordPress 網(wǎng)站上完成工作。
雖然我得到了一些結(jié)果(在某些情況下很酷),但所使用的語(yǔ)言沒(méi)有一種能引起共鳴,我對(duì)此卻毫無(wú)察覺(jué)。我認(rèn)為編程語(yǔ)言僅僅是一種達(dá)到目的的手段,幾乎沒(méi)有機(jī)會(huì)讓人感到它很有趣。大約是在這個(gè)時(shí)候,一個(gè)朋友邀請(qǐng)我和他一起參加hackathon 項(xiàng)目來(lái)構(gòu)建Ruby 庫(kù)。
我開(kāi)始感到世界變得五彩繽紛,就連水果都嘗起來(lái)更甜等多種美好的體驗(yàn)。Ruby 易于使用解釋性語(yǔ)言和人性化的語(yǔ)法,這讓我想起了一直在使用的工具。雖然我沒(méi)有堅(jiān)持使用Ruby太長(zhǎng)時(shí)間,但我決定在個(gè)人網(wǎng)站的下一次迭代中嘗試使用Python 和Django 網(wǎng)頁(yè)框架。它給了我和Ruby框架一樣的快樂(lè)和淺易的學(xué)習(xí)曲線,從此我再也沒(méi)有走過(guò)彎路。
目前Python 被廣泛地認(rèn)為是許多任務(wù)的語(yǔ)言,軟件開(kāi)發(fā)人員不需要再經(jīng)歷我所嘗試的反復(fù)試驗(yàn)過(guò)程。進(jìn)入軟件行業(yè)的嶄新的、有趣的途徑也正在全面展開(kāi)。盡管存在很多差異,但是希望我們都能分享在Python 編程中找到的樂(lè)趣。希望本書(shū)能為你找到這種樂(lè)趣做出貢獻(xiàn)。
來(lái)吧,在奇妙的Python 之旅中,我遇到了不少驚喜。我想見(jiàn)證你建立一個(gè)網(wǎng)站、一個(gè)數(shù)據(jù)管道,或者是一個(gè)自動(dòng)植物澆水系統(tǒng)。
不管你喜歡什么,Python 都能給你提供支持。
Dane Hillard是一位軟件工程師、Web開(kāi)發(fā)人員和Python國(guó)際會(huì)議演講者,他感興趣的領(lǐng)域包括教育、生物技術(shù)和開(kāi)源。Dane編寫(xiě)專業(yè)的Python軟件已有10年。
Dane在密歇根大學(xué)獲得計(jì)算機(jī)工程學(xué)士學(xué)位,輔修數(shù)學(xué)。作為一名軟件工程師,Dane曾在SAIC(現(xiàn)為L(zhǎng)eidos)從事情報(bào)研究和開(kāi)發(fā)工作,在Compendia Bioscience(現(xiàn)已并入賽默飛世爾科技公司)從事個(gè)性化癌癥基因組學(xué)研究。Dane目前為ITHAKA的首席Web應(yīng)用程序開(kāi)發(fā)人員,他主要專注于Python、Django的Web開(kāi)發(fā),以及用于學(xué)術(shù)研究的前端技術(shù)。
第Ⅰ部分 為什么學(xué)習(xí)Python
第1 章 Python 總覽 3
1.1 Python 是一種企業(yè)語(yǔ)言 5
1.1.1 時(shí)代在改變 5
1.1.2 我喜歡Python 的原因 5
1.2 Python 是一種教學(xué)語(yǔ)言 6
1.3 設(shè)計(jì)是一個(gè)過(guò)程 6
1.3.1 用戶體驗(yàn) 8
1.3.2 你以前接觸過(guò)的情況 9
1.4 設(shè)計(jì)更好的軟件 10
1.4.1 軟件設(shè)計(jì)注意事項(xiàng) 10
1.4.2 有機(jī)增長(zhǎng)的軟件 11
1.5 何時(shí)投資設(shè)計(jì) 13
1.6 新的開(kāi)始 14
1.7 設(shè)計(jì)是平等的 15
1.8 如何使用本書(shū) 18
1.9 本章小結(jié) 19
第Ⅱ部分 設(shè)計(jì)基礎(chǔ)
第2 章 關(guān)注點(diǎn)分離 23
2.1 命名空間 24
2.1.1 命名空間和導(dǎo)入語(yǔ)句 25
2.1.2 導(dǎo)入的多重面紗 27
2.1.3 命名空間可避免沖突 29
2.2 Python 中的分離層級(jí) 31
2.2.1 函數(shù) 31
2.2.2 類 39
2.2.3 模塊 46
2.2.4 包 47
2.3 本章小結(jié) 49
第3 章 抽象和封裝 51
3.1 什么是抽象 51
3.1.1 黑匣子 52
3.1.2 抽象就像洋蔥 53
3.1.3 抽象即簡(jiǎn)化 56
3.1.4 分解實(shí)現(xiàn)抽象 57
3.2 封裝 58
3.2.1 Python 中的封裝構(gòu)造 58
3.2.2 Python 中的私有變量 60
3.3 試一試 60
3.4 編程風(fēng)格也是一種抽象 64
3.4.1 過(guò)程式編程 64
3.4.2 函數(shù)式編程 64
3.4.3 聲明式編程 66
3.5 類型、繼承和多態(tài)性 68
3.6 了解錯(cuò)誤的抽象 70
3.6.1 方枘圓鑿 71
3.6.2 智者更智 71
3.7 本章小結(jié) 72
第4 章 設(shè)計(jì)高性能的代碼 73
4.1 穿越時(shí)空 74
4.1.1 復(fù)雜度有點(diǎn)復(fù)雜 74
4.1.2 時(shí)間復(fù)雜度 75
4.1.3 空間復(fù)雜度 79
4.2 性能與數(shù)據(jù)類型 81
4.2.1 常量時(shí)間的數(shù)據(jù)類型 81
4.2.2 線性時(shí)間的數(shù)據(jù)類型 82
4.2.3 在數(shù)據(jù)類型上操作的空間復(fù)雜度 82
4.3 讓它能夠運(yùn)行,正確運(yùn)行,快速運(yùn)行 86
4.3.1 讓它運(yùn)行 86
4.3.2 讓它正確運(yùn)行 87
4.3.3 讓它快速運(yùn)行 90
4.4 工具 91
4.4.1 timeit 模塊 92
4.4.2 CPU 性能分析 93
4.5 試一試 95
4.6 本章小結(jié) 96
第5 章 測(cè)試軟件 97
5.1 什么是軟件測(cè)試 98
5.1.1 軟件是否按照要求運(yùn)行 98
5.1.2 功能測(cè)試剖析 99
5.2 功能測(cè)試方法 100
5.2.1 手動(dòng)測(cè)試 100
5.2.2 自動(dòng)化測(cè)試 101
5.2.3 驗(yàn)收測(cè)試 101
5.2.4 單元測(cè)試 103
5.2.5 集成測(cè)試 105
5.2.6 測(cè)試金字塔 105
5.2.7 回歸測(cè)試 106
5.3 事實(shí)陳述 107
5.4 使用unittest 進(jìn)行單元測(cè)試 108
5.4.1 使用unittest 測(cè)試組織 108
5.4.2 使用unittest 運(yùn)行測(cè)試 109
5.4.3 使用unittest 編寫(xiě)個(gè)測(cè)試 109
5.4.4 使用unittest 編寫(xiě)個(gè)集成測(cè)試 113
5.4.5 測(cè)試替身 116
5.4.6 試一試 118
5.4.7 編寫(xiě)有趣的測(cè)試 121
5.5 使用pytest測(cè)試 121
5.5.1 使用pytest 測(cè)試組織 122
5.5.2 把unittest測(cè)試轉(zhuǎn)換為pytest 123
5.6 超越功能測(cè)試 124
5.6.1 性能測(cè)試 124
5.6.2 負(fù)載測(cè)試 125
5.7 測(cè)試驅(qū)動(dòng)開(kāi)發(fā):入門 126
5.7.1 測(cè)試驅(qū)動(dòng)開(kāi)發(fā)是一種心態(tài) 126
5.7.2 測(cè)試驅(qū)動(dòng)開(kāi)發(fā)是一種哲學(xué) 126
5.8 本章小結(jié) 127
第Ⅲ部分 明確大型系統(tǒng)
第6 章 實(shí)踐中的關(guān)注點(diǎn)分離 131
6.1 命令行書(shū)簽應(yīng)用程序 132
6.2 踏上Bark 之旅 133
6.3 初始代碼結(jié)構(gòu) 134
6.3.1 持久層 136
6.3.2 業(yè)務(wù)邏輯層 148
6.3.3 表示層 153
6.4 本章小結(jié) 162
第7 章 可擴(kuò)展性和靈活性 163
7.1 什么是可擴(kuò)展的代碼 163
7.1.1 添加新行為 164
7.1.2 修改現(xiàn)有行為 167
7.1.3 松耦合 168
7.2 解決僵化性 170
7.2.1 放手:控制反轉(zhuǎn) 171
7.2.2 細(xì)節(jié)決定成。阂蕾嚱涌 175
7.2.3 抵抗熵:穩(wěn)健性原則 176
7.3 擴(kuò)展練習(xí) 177
7.4 本章小結(jié) 182
第8 章 有關(guān)繼承的規(guī)則(及例外) 183
8.1 過(guò)去編程中的繼承 183
8.1.1 銀彈 184
8.1.2 繼承的挑戰(zhàn) 184
8.2 當(dāng)前編程中的繼承 186
8.2.1 繼承到底是為了什么 186
8.2.2 可替代性 188
8.2.3 繼承的理想用例 189
8.3 Python 中的繼承 192
8.3.1 類型檢查 192
8.3.2 超類訪問(wèn) 193
8.3.3 多重繼承和方法解析順序 194
8.3.4 抽象基類 198
8.4 Bark 中的繼承和組合 201
8.4.1 重構(gòu)以使用抽象基類 201
8.4.2 對(duì)繼承工作進(jìn)行后的檢查 203
8.5 本章小結(jié) 204
第9 章 保持輕量級(jí) 205
9.1 類/函數(shù)/模塊應(yīng)該有多大 206
9.1.1 物理度量 206
9.1.2 單一職責(zé) 207
9.1.3 代碼的復(fù)雜度 207
9.2 分解復(fù)雜度 212
9.2.1 提取配置 212
9.2.2 提取函數(shù) 215
9.3 分解類 218
9.3.1 復(fù)雜度初始化 218
9.3.2 提取類和轉(zhuǎn)發(fā)調(diào)用 221
9.4 本章小結(jié) 226
第10 章 實(shí)現(xiàn)松耦合 227
10.1 定義耦合 227
10.1.1 結(jié)締組織 228
10.1.2 緊耦合 229
10.1.3 松耦合 232
10.2 識(shí)別耦合 235
10.2.1 依戀情結(jié) 235
10.2.2 散彈式修改 237
10.2.3 抽象泄漏 237
10.3 Bark 中的耦合 238
10.4 尋址耦合 241
10.4.1 用戶消息傳遞 241
10.4.2 書(shū)簽持久性· 245
10.4.3 試一試 246
10.5 本章小結(jié) 250
第Ⅳ部分 下一步學(xué)習(xí)什么
第11 章 全力以赴 253
11.1 現(xiàn)在怎么辦 253
11.1.1 制訂計(jì)劃 254
11.1.2 執(zhí)行計(jì)劃 256
11.1.3 跟蹤進(jìn)度 257
11.2 設(shè)計(jì)模式 259
11.2.1 Python 設(shè)計(jì)模式的起伏 261
11.2.2 需要了解的術(shù)語(yǔ) 261
11.3 分布式系統(tǒng) 262
11.3.1 分布式系統(tǒng)中的故障模式 263
11.3.2 尋址應(yīng)用程序狀態(tài) 263
11.3.3 入門術(shù)語(yǔ) 264
11.4 進(jìn)行Python深潛 264
11.4.1 Python 代碼樣式 264
11.4.2 語(yǔ)言特征是模式 265
11.4.3 入門術(shù)語(yǔ) 266
11.5 你已經(jīng)了解的內(nèi)容 266
11.5.1 開(kāi)發(fā)人員的心得體會(huì) 267
11.5.2 即將完結(jié) 268
11.6 本章小結(jié) 269
附錄A 安裝Python 271
A.1 我應(yīng)該使用什么版本的Python 271
A.2 系統(tǒng)Python 272
A.3 安裝其他版本的Python 272
A.3.1 下載官方Python 272
A.3.2 使用Anaconda下載 274
A.4 驗(yàn)證安裝 274