主要內(nèi)容 組織大型Python項目 實現(xiàn)合適的抽象級別 編寫整潔并可重用的代碼 繼承和組合 測試和性能的注意事項
專業(yè)質(zhì)量的代碼不僅運行時沒有錯誤,而且整潔、易讀、易維護。想從一個有能力的Python程序員成長為專業(yè)的開發(fā)人員,讀者需要學習編碼風格、應用程序設計和開發(fā)流程的行業(yè)標準。這正是本書的特色與要講解的內(nèi)容。
本書教會讀者設計和編寫可理解、可維護和可擴展的專業(yè)軟件。作者Dane Hillard是一位Python專業(yè)人士,幫助過許多開發(fā)人員完成Python項目的設計和編寫,他知道在此過程中需要做些什么。他通過有用的示例和練習,讓讀者明白在什么時機,如何將代碼模塊化,如何通過降低復雜度來提高代碼質(zhì)量,以及為什么這樣做等。遵循這些核心原則,所編寫的代碼將更易于自己和他人閱讀、維護和重用。
與我本人一樣,Python 誕生于1989 年12 月。雖然我在過去三十年里已經(jīng)取得了很大的成就,但是Python 的成功顯然更加顯著。
如今,越來越多的人使用Python 來完成數(shù)據(jù)科學、機器學習等方面的有趣事情。自從學習了Python,這門萬事俱備的第二好語言實際上已經(jīng)成為我完成很多事情的。
在密歇根大學電子工程和計算機科學系學習期間,我有過一段相當傳統(tǒng)的編程經(jīng)歷。那時,課程主要集中在我次在學校外工作時繼續(xù)使用的C 和MATLAB 編程語言上。我在下一個職位上開發(fā)了一些shell 腳本和SQL 腳本,用于處理生物信息學大數(shù)據(jù)。我也使用PHP 從零開始在個人WordPress 網(wǎng)站上完成工作。
雖然我得到了一些結(jié)果(在某些情況下很酷),但所使用的語言沒有一種能引起共鳴,我對此卻毫無察覺。我認為編程語言僅僅是一種達到目的的手段,幾乎沒有機會讓人感到它很有趣。大約是在這個時候,一個朋友邀請我和他一起參加hackathon 項目來構(gòu)建Ruby 庫。
我開始感到世界變得五彩繽紛,就連水果都嘗起來更甜等多種美好的體驗。Ruby 易于使用解釋性語言和人性化的語法,這讓我想起了一直在使用的工具。雖然我沒有堅持使用Ruby太長時間,但我決定在個人網(wǎng)站的下一次迭代中嘗試使用Python 和Django 網(wǎng)頁框架。它給了我和Ruby框架一樣的快樂和淺易的學習曲線,從此我再也沒有走過彎路。
目前Python 被廣泛地認為是許多任務的語言,軟件開發(fā)人員不需要再經(jīng)歷我所嘗試的反復試驗過程。進入軟件行業(yè)的嶄新的、有趣的途徑也正在全面展開。盡管存在很多差異,但是希望我們都能分享在Python 編程中找到的樂趣。希望本書能為你找到這種樂趣做出貢獻。
來吧,在奇妙的Python 之旅中,我遇到了不少驚喜。我想見證你建立一個網(wǎng)站、一個數(shù)據(jù)管道,或者是一個自動植物澆水系統(tǒng)。
不管你喜歡什么,Python 都能給你提供支持。
Dane Hillard是一位軟件工程師、Web開發(fā)人員和Python國際會議演講者,他感興趣的領域包括教育、生物技術和開源。Dane編寫專業(yè)的Python軟件已有10年。
Dane在密歇根大學獲得計算機工程學士學位,輔修數(shù)學。作為一名軟件工程師,Dane曾在SAIC(現(xiàn)為Leidos)從事情報研究和開發(fā)工作,在Compendia Bioscience(現(xiàn)已并入賽默飛世爾科技公司)從事個性化癌癥基因組學研究。Dane目前為ITHAKA的首席Web應用程序開發(fā)人員,他主要專注于Python、Django的Web開發(fā),以及用于學術研究的前端技術。
第Ⅰ部分 為什么學習Python
第1 章 Python 總覽 3
1.1 Python 是一種企業(yè)語言 5
1.1.1 時代在改變 5
1.1.2 我喜歡Python 的原因 5
1.2 Python 是一種教學語言 6
1.3 設計是一個過程 6
1.3.1 用戶體驗 8
1.3.2 你以前接觸過的情況 9
1.4 設計更好的軟件 10
1.4.1 軟件設計注意事項 10
1.4.2 有機增長的軟件 11
1.5 何時投資設計 13
1.6 新的開始 14
1.7 設計是平等的 15
1.8 如何使用本書 18
1.9 本章小結(jié) 19
第Ⅱ部分 設計基礎
第2 章 關注點分離 23
2.1 命名空間 24
2.1.1 命名空間和導入語句 25
2.1.2 導入的多重面紗 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 分解實現(xiàn)抽象 57
3.2 封裝 58
3.2.1 Python 中的封裝構(gòu)造 58
3.2.2 Python 中的私有變量 60
3.3 試一試 60
3.4 編程風格也是一種抽象 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 章 設計高性能的代碼 73
4.1 穿越時空 74
4.1.1 復雜度有點復雜 74
4.1.2 時間復雜度 75
4.1.3 空間復雜度 79
4.2 性能與數(shù)據(jù)類型 81
4.2.1 常量時間的數(shù)據(jù)類型 81
4.2.2 線性時間的數(shù)據(jù)類型 82
4.2.3 在數(shù)據(jù)類型上操作的空間復雜度 82
4.3 讓它能夠運行,正確運行,快速運行 86
4.3.1 讓它運行 86
4.3.2 讓它正確運行 87
4.3.3 讓它快速運行 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 軟件是否按照要求運行 98
5.1.2 功能測試剖析 99
5.2 功能測試方法 100
5.2.1 手動測試 100
5.2.2 自動化測試 101
5.2.3 驗收測試 101
5.2.4 單元測試 103
5.2.5 集成測試 105
5.2.6 測試金字塔 105
5.2.7 回歸測試 106
5.3 事實陳述 107
5.4 使用unittest 進行單元測試 108
5.4.1 使用unittest 測試組織 108
5.4.2 使用unittest 運行測試 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 負載測試 125
5.7 測試驅(qū)動開發(fā):入門 126
5.7.1 測試驅(qū)動開發(fā)是一種心態(tài) 126
5.7.2 測試驅(qū)動開發(fā)是一種哲學 126
5.8 本章小結(jié) 127
第Ⅲ部分 明確大型系統(tǒng)
第6 章 實踐中的關注點分離 131
6.1 命令行書簽應用程序 132
6.2 踏上Bark 之旅 133
6.3 初始代碼結(jié)構(gòu) 134
6.3.1 持久層 136
6.3.2 業(yè)務邏輯層 148
6.3.3 表示層 153
6.4 本章小結(jié) 162
第7 章 可擴展性和靈活性 163
7.1 什么是可擴展的代碼 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 細節(jié)決定成敗:依賴接口 175
7.2.3 抵抗熵:穩(wěn)健性原則 176
7.3 擴展練習 177
7.4 本章小結(jié) 182
第8 章 有關繼承的規(guī)則(及例外) 183
8.1 過去編程中的繼承 183
8.1.1 銀彈 184
8.1.2 繼承的挑戰(zhàn) 184
8.2 當前編程中的繼承 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 對繼承工作進行后的檢查 203
8.5 本章小結(jié) 204
第9 章 保持輕量級 205
9.1 類/函數(shù)/模塊應該有多大 206
9.1.1 物理度量 206
9.1.2 單一職責 207
9.1.3 代碼的復雜度 207
9.2 分解復雜度 212
9.2.1 提取配置 212
9.2.2 提取函數(shù) 215
9.3 分解類 218
9.3.1 復雜度初始化 218
9.3.2 提取類和轉(zhuǎn)發(fā)調(diào)用 221
9.4 本章小結(jié) 226
第10 章 實現(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
第Ⅳ部分 下一步學習什么
第11 章 全力以赴 253
11.1 現(xiàn)在怎么辦 253
11.1.1 制訂計劃 254
11.1.2 執(zhí)行計劃 256
11.1.3 跟蹤進度 257
11.2 設計模式 259
11.2.1 Python 設計模式的起伏 261
11.2.2 需要了解的術語 261
11.3 分布式系統(tǒng) 262
11.3.1 分布式系統(tǒng)中的故障模式 263
11.3.2 尋址應用程序狀態(tài) 263
11.3.3 入門術語 264
11.4 進行Python深潛 264
11.4.1 Python 代碼樣式 264
11.4.2 語言特征是模式 265
11.4.3 入門術語 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 我應該使用什么版本的Python 271
A.2 系統(tǒng)Python 272
A.3 安裝其他版本的Python 272
A.3.1 下載官方Python 272
A.3.2 使用Anaconda下載 274
A.4 驗證安裝 274