主要內(nèi)容 組織大型Python項(xiàng)目 實(shí)現(xiàn)合適的抽象級別 編寫整潔并可重用的代碼 繼承和組合 測試和性能的注意事項(xiàng)
專業(yè)質(zhì)量的代碼不僅運(yùn)行時沒有錯誤,而且整潔、易讀、易維護(hù)。想從一個有能力的Python程序員成長為專業(yè)的開發(fā)人員,讀者需要學(xué)習(xí)編碼風(fēng)格、應(yīng)用程序設(shè)計(jì)和開發(fā)流程的行業(yè)標(biāo)準(zhǔn)。這正是本書的特色與要講解的內(nèi)容。
本書教會讀者設(shè)計(jì)和編寫可理解、可維護(hù)和可擴(kuò)展的專業(yè)軟件。作者Dane Hillard是一位Python專業(yè)人士,幫助過許多開發(fā)人員完成Python項(xiàng)目的設(shè)計(jì)和編寫,他知道在此過程中需要做些什么。他通過有用的示例和練習(xí),讓讀者明白在什么時機(jī),如何將代碼模塊化,如何通過降低復(fù)雜度來提高代碼質(zhì)量,以及為什么這樣做等。遵循這些核心原則,所編寫的代碼將更易于自己和他人閱讀、維護(hù)和重用。
與我本人一樣,Python 誕生于1989 年12 月。雖然我在過去三十年里已經(jīng)取得了很大的成就,但是Python 的成功顯然更加顯著。
如今,越來越多的人使用Python 來完成數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)等方面的有趣事情。自從學(xué)習(xí)了Python,這門萬事俱備的第二好語言實(shí)際上已經(jīng)成為我完成很多事情的。
在密歇根大學(xué)電子工程和計(jì)算機(jī)科學(xué)系學(xué)習(xí)期間,我有過一段相當(dāng)傳統(tǒng)的編程經(jīng)歷。那時,課程主要集中在我次在學(xué)校外工作時繼續(xù)使用的C 和MATLAB 編程語言上。我在下一個職位上開發(fā)了一些shell 腳本和SQL 腳本,用于處理生物信息學(xué)大數(shù)據(jù)。我也使用PHP 從零開始在個人WordPress 網(wǎng)站上完成工作。
雖然我得到了一些結(jié)果(在某些情況下很酷),但所使用的語言沒有一種能引起共鳴,我對此卻毫無察覺。我認(rèn)為編程語言僅僅是一種達(dá)到目的的手段,幾乎沒有機(jī)會讓人感到它很有趣。大約是在這個時候,一個朋友邀請我和他一起參加hackathon 項(xiàng)目來構(gòu)建Ruby 庫。
我開始感到世界變得五彩繽紛,就連水果都嘗起來更甜等多種美好的體驗(yàn)。Ruby 易于使用解釋性語言和人性化的語法,這讓我想起了一直在使用的工具。雖然我沒有堅(jiān)持使用Ruby太長時間,但我決定在個人網(wǎng)站的下一次迭代中嘗試使用Python 和Django 網(wǎng)頁框架。它給了我和Ruby框架一樣的快樂和淺易的學(xué)習(xí)曲線,從此我再也沒有走過彎路。
目前Python 被廣泛地認(rèn)為是許多任務(wù)的語言,軟件開發(fā)人員不需要再經(jīng)歷我所嘗試的反復(fù)試驗(yàn)過程。進(jìn)入軟件行業(yè)的嶄新的、有趣的途徑也正在全面展開。盡管存在很多差異,但是希望我們都能分享在Python 編程中找到的樂趣。希望本書能為你找到這種樂趣做出貢獻(xiàn)。
來吧,在奇妙的Python 之旅中,我遇到了不少驚喜。我想見證你建立一個網(wǎng)站、一個數(shù)據(jù)管道,或者是一個自動植物澆水系統(tǒng)。
不管你喜歡什么,Python 都能給你提供支持。
Dane Hillard是一位軟件工程師、Web開發(fā)人員和Python國際會議演講者,他感興趣的領(lǐng)域包括教育、生物技術(shù)和開源。Dane編寫專業(yè)的Python軟件已有10年。
Dane在密歇根大學(xué)獲得計(jì)算機(jī)工程學(xué)士學(xué)位,輔修數(shù)學(xué)。作為一名軟件工程師,Dane曾在SAIC(現(xiàn)為Leidos)從事情報(bào)研究和開發(fā)工作,在Compendia Bioscience(現(xiàn)已并入賽默飛世爾科技公司)從事個性化癌癥基因組學(xué)研究。Dane目前為ITHAKA的首席Web應(yīng)用程序開發(fā)人員,他主要專注于Python、Django的Web開發(fā),以及用于學(xué)術(shù)研究的前端技術(shù)。
第Ⅰ部分 為什么學(xué)習(xí)Python
第1 章 Python 總覽 3
1.1 Python 是一種企業(yè)語言 5
1.1.1 時代在改變 5
1.1.2 我喜歡Python 的原因 5
1.2 Python 是一種教學(xué)語言 6
1.3 設(shè)計(jì)是一個過程 6
1.3.1 用戶體驗(yàn) 8
1.3.2 你以前接觸過的情況 9
1.4 設(shè)計(jì)更好的軟件 10
1.4.1 軟件設(shè)計(jì)注意事項(xiàng) 10
1.4.2 有機(jī)增長的軟件 11
1.5 何時投資設(shè)計(jì) 13
1.6 新的開始 14
1.7 設(shè)計(jì)是平等的 15
1.8 如何使用本書 18
1.9 本章小結(jié) 19
第Ⅱ部分 設(shè)計(jì)基礎(chǔ)
第2 章 關(guān)注點(diǎn)分離 23
2.1 命名空間 24
2.1.1 命名空間和導(dǎo)入語句 25
2.1.2 導(dǎo)入的多重面紗 27
2.1.3 命名空間可避免沖突 29
2.2 Python 中的分離層級 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 抽象即簡化 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 過程式編程 64
3.4.2 函數(shù)式編程 64
3.4.3 聲明式編程 66
3.5 類型、繼承和多態(tài)性 68
3.6 了解錯誤的抽象 70
3.6.1 方枘圓鑿 71
3.6.2 智者更智 71
3.7 本章小結(jié) 72
第4 章 設(shè)計(jì)高性能的代碼 73
4.1 穿越時空 74
4.1.1 復(fù)雜度有點(diǎn)復(fù)雜 74
4.1.2 時間復(fù)雜度 75
4.1.3 空間復(fù)雜度 79
4.2 性能與數(shù)據(jù)類型 81
4.2.1 常量時間的數(shù)據(jù)類型 81
4.2.2 線性時間的數(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 章 測試軟件 97
5.1 什么是軟件測試 98
5.1.1 軟件是否按照要求運(yùn)行 98
5.1.2 功能測試剖析 99
5.2 功能測試方法 100
5.2.1 手動測試 100
5.2.2 自動化測試 101
5.2.3 驗(yàn)收測試 101
5.2.4 單元測試 103
5.2.5 集成測試 105
5.2.6 測試金字塔 105
5.2.7 回歸測試 106
5.3 事實(shí)陳述 107
5.4 使用unittest 進(jìn)行單元測試 108
5.4.1 使用unittest 測試組織 108
5.4.2 使用unittest 運(yùn)行測試 109
5.4.3 使用unittest 編寫個測試 109
5.4.4 使用unittest 編寫個集成測試 113
5.4.5 測試替身 116
5.4.6 試一試 118
5.4.7 編寫有趣的測試 121
5.5 使用pytest測試 121
5.5.1 使用pytest 測試組織 122
5.5.2 把unittest測試轉(zhuǎn)換為pytest 123
5.6 超越功能測試 124
5.6.1 性能測試 124
5.6.2 負(fù)載測試 125
5.7 測試驅(qū)動開發(fā):入門 126
5.7.1 測試驅(qū)動開發(fā)是一種心態(tài) 126
5.7.2 測試驅(qū)動開發(fā)是一種哲學(xué) 126
5.8 本章小結(jié) 127
第Ⅲ部分 明確大型系統(tǒng)
第6 章 實(shí)踐中的關(guān)注點(diǎn)分離 131
6.1 命令行書簽應(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 過去編程中的繼承 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 超類訪問 193
8.3.3 多重繼承和方法解析順序 194
8.3.4 抽象基類 198
8.4 Bark 中的繼承和組合 201
8.4.1 重構(gòu)以使用抽象基類 201
8.4.2 對繼承工作進(jìn)行后的檢查 203
8.5 本章小結(jié) 204
第9 章 保持輕量級 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 識別耦合 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 書簽持久性· 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ù)語 261
11.3 分布式系統(tǒng) 262
11.3.1 分布式系統(tǒng)中的故障模式 263
11.3.2 尋址應(yīng)用程序狀態(tài) 263
11.3.3 入門術(shù)語 264
11.4 進(jìn)行Python深潛 264
11.4.1 Python 代碼樣式 264
11.4.2 語言特征是模式 265
11.4.3 入門術(shù)語 266
11.5 你已經(jīng)了解的內(nèi)容 266
11.5.1 開發(fā)人員的心得體會 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