Python作為一種高-級(jí)程序設(shè)計(jì)語(yǔ)言,憑借其簡(jiǎn)潔、易讀及可擴(kuò)展性日漸成為程序設(shè)計(jì)領(lǐng)域備受推崇的語(yǔ)言之一。
本書(shū)基于Python 3.5版本進(jìn)行講解,通過(guò)13章的內(nèi)容,深度揭示了Python編程的高-級(jí)技巧。本書(shū)從Python語(yǔ)言及其社區(qū)的現(xiàn)狀開(kāi)始介紹,對(duì)Python語(yǔ)法、命名規(guī)則、Python包的編寫(xiě)、部署代碼、擴(kuò)展程序開(kāi)發(fā)、管理代碼、文檔編寫(xiě)、測(cè)試開(kāi)發(fā)、代碼優(yōu)化、并發(fā)編程、設(shè)計(jì)模式等重要話(huà)題進(jìn)行了全面系統(tǒng)化的講解。
本書(shū)適合想要進(jìn)一步提高自身Python編程技能的讀者閱讀,也適合對(duì)Python編程感興趣的讀者參考學(xué)習(xí)。全書(shū)結(jié)合典型且實(shí)用的開(kāi)發(fā)案例,可以幫助讀者創(chuàng)建高性能的、可靠且可維護(hù)的Python應(yīng)用。
Python是一門(mén)動(dòng)態(tài)編程語(yǔ)言,它簡(jiǎn)單而又強(qiáng)大,適用于眾多領(lǐng)域。盡管編寫(xiě)Python代碼比較容易,但是編寫(xiě)高效且易于維護(hù)和復(fù)用的代碼是一個(gè)挑戰(zhàn)。
本書(shū)的重點(diǎn)是讓你熟悉zui佳實(shí)踐、有用的工具以及標(biāo)準(zhǔn),這都是Python專(zhuān)業(yè)人士每天使用的。首先,你將了解Python 3.5中新增加的功能以及可以提高生產(chǎn)力的快速技巧。接下來(lái),你將學(xué)習(xí)使用這個(gè)新版本中的高-級(jí)且有用的Python語(yǔ)法元素,以及實(shí)現(xiàn)元編程的不同方法。本書(shū)講解了代碼管理工具、編寫(xiě)清晰文檔的方法和測(cè)試驅(qū)動(dòng)開(kāi)發(fā),這些都是編寫(xiě)代碼的重要因素。通過(guò)學(xué)習(xí)優(yōu)化的一般原則、查找瓶頸的策略以及應(yīng)用優(yōu)化的選定工具,你可以對(duì)如何編寫(xiě)高效的代碼有更深入的理解。
讀完本書(shū)后,你會(huì)成為一名可以編寫(xiě)高效且可維護(hù)代碼的專(zhuān)家。
通過(guò)閱讀本書(shū),你將能夠:
了解在Python社區(qū)中廣泛采用的約定和zui佳實(shí)踐;
高效打包Python代碼,以便將其應(yīng)用于社區(qū)和生產(chǎn);
應(yīng)用在遠(yuǎn)程系統(tǒng)上自動(dòng)化部署代碼的簡(jiǎn)單且輕量的方法;
提高代碼的質(zhì)量、可靠性及性能;
在Python中編寫(xiě)并發(fā)代碼;
使用其他語(yǔ)言編寫(xiě)的代碼來(lái)擴(kuò)展Python。
Micha? Jaworski有著7年P(guān)ython編程的經(jīng)驗(yàn)。他還是graceful的創(chuàng)建者,這是一個(gè)構(gòu)建于falcon之上的REST框架。他曾在不同的公司擔(dān)任過(guò)多種角色,從一名普通的全棧開(kāi)發(fā)人員到軟件架構(gòu)師再到一家快節(jié)奏創(chuàng)業(yè)公司的工程副總裁。他目前是Opera軟件公司TV Store(電視應(yīng)用商店)團(tuán)隊(duì)的首-席后端工程師。他在設(shè)計(jì)高性能的分布式服務(wù)方面擁有豐富的經(jīng)驗(yàn)。他還是一些流行的Python開(kāi)源項(xiàng)目的活躍貢獻(xiàn)者。
Tarek Ziade?是Mozilla的工程經(jīng)理,與一個(gè)專(zhuān)門(mén)用Python為Firefox構(gòu)建大規(guī)模Web應(yīng)用的團(tuán)隊(duì)合作。他對(duì)Python打包做出過(guò)貢獻(xiàn),而且從早期Zope開(kāi)始就使用過(guò)各種不同的Python Web框架。
Tarek還創(chuàng)建了Afpy法國(guó)的Python用戶(hù)組,并且用法語(yǔ)寫(xiě)過(guò)兩本關(guān)于Python的書(shū)。他還在諸如Solutions Linux、PyCon、OSCON和EuroPython等國(guó)際活動(dòng)中做過(guò)多次法語(yǔ)演講和教學(xué)。
目錄
第1章 Python現(xiàn)狀 1
1.1
Python的現(xiàn)狀與未來(lái) 1
1.2
Python升級(jí)及其原因 2
1.3 追蹤Python最新變化PEP文檔 2
1.4 當(dāng)前Python 3的普及程度 3
1.5
Python 3和Python 2的主要差異 4
1.5.1
為什么要關(guān)注這些差異 4
1.5.2
主要的語(yǔ)法差異和常見(jiàn)陷阱 4
1.5.3
用于保持跨版本兼容性的常用工具和技術(shù) 6
1.6 不只是CPython 9
1.6.1
為什么要關(guān)注Python實(shí)現(xiàn) 10
1.6.2
Stackless Python 10
1.6.3
Jython 10
1.6.4
IronPython 11
1.6.5
PyPy 11
1.7
Python開(kāi)發(fā)的現(xiàn)代方法 12
1.8 應(yīng)用層Python環(huán)境隔離 13
1.8.1
為什么要隔離 14
1.8.2
常用解決方案 15
1.8.3
選擇哪種工具 18
1.9 系統(tǒng)級(jí)環(huán)境隔離 19
1.9.1
使用Vagrant的虛擬開(kāi)發(fā)環(huán)境 20
1.9.2
容器化與虛擬化的對(duì)比 21
1.10
常用的生產(chǎn)力工具 21
1.10.1
自定義Python shell IPython、bpython、 ptpython等 22
1.10.2
交互式調(diào)試器 24
1.11
有用的資源 25
1.12
小結(jié) 25
第2章 語(yǔ)法最佳實(shí)踐類(lèi)級(jí)別以下 26
2.1
Python的內(nèi)置類(lèi)型 26
2.1.1
字符串與字節(jié) 27
2.1.2
集合類(lèi)型 30
2.2 高級(jí)語(yǔ)法 39
2.2.1
迭代器 40
2.2.2
yield語(yǔ)句 41
2.2.3
裝飾器 44
2.2.4
上下文管理器with語(yǔ)句 54
2.3 你可能還不知道的其他語(yǔ)法元素 58
2.3.1
for...else...語(yǔ)句 58
2.3.2
函數(shù)注解 59
2.4 小結(jié) 60
第3章 語(yǔ)法最佳實(shí)踐類(lèi)級(jí)別以上 61
3.1 子類(lèi)化內(nèi)置類(lèi)型 61
3.2 訪(fǎng)問(wèn)超類(lèi)中的方法 63
3.2.1
Python 2中的舊式類(lèi)與super 65
3.2.2
理解Python的方法解析順序 66
3.2.3
使用super易犯的錯(cuò)誤 70
3.2.4
最佳實(shí)踐 73
3.3 高級(jí)屬性訪(fǎng)問(wèn)模式 73
3.3.1
描述符 74
3.3.2
property 79
3.3.3
槽 81
3.4 元編程 82
3.4.1
裝飾器
一種元編程方法 83
3.4.2
類(lèi)裝飾器 83
3.4.3
使用__new__()方法覆寫(xiě)實(shí)例創(chuàng)建過(guò)程 85
3.4.4
元類(lèi) 87
3.4.5
一些關(guān)于代碼生成的提示 94
3.5 小結(jié) 100
第4章 選擇好的名稱(chēng) 101
4.1
PEP 8與命名最佳實(shí)踐 101
4.1.1
為何要遵守PEP 8以及何時(shí)遵守PEP 8 101
4.1.2
超越PEP 8團(tuán)隊(duì)的風(fēng)格指南 102
4.2 命名風(fēng)格 102
4.3 命名指南 110
4.3.1
用has或is前綴命名布爾元素 111
4.3.2
用復(fù)數(shù)形式命名集合變量 111
4.3.3
用顯式名稱(chēng)命名字典 111
4.3.4
避免通用名稱(chēng) 111
4.3.5
避免現(xiàn)有名稱(chēng) 112
4.4 參數(shù)的最佳實(shí)踐 113
4.4.1
通過(guò)迭代設(shè)計(jì)構(gòu)建參數(shù) 113
4.4.2
信任參數(shù)和測(cè)試 114
4.4.3
小心使用*args和**kwargs魔法參數(shù) 115
4.5 類(lèi)的名稱(chēng) 117
4.6 模塊和包的名稱(chēng) 117
4.7 有用的工具 118
4.7.1
Pylint 118
4.7.2
pep8和flake8 120
4.8 小結(jié) 120
第5章 編寫(xiě)一個(gè)包 121
5.1 創(chuàng)建一個(gè)包 121
5.1.1
Python打包工具的混亂狀態(tài) 122
5.1.2
項(xiàng)目配置 123
5.1.3
自定義setup命令 131
5.1.4
在開(kāi)發(fā)期間使用包 132
5.2 命名空間包 133
5.2.1
為什么有用 133
5.2.2
PEP 420隱式命名空間包 135
5.2.3
以前Python版本中的命名空間包 136
5.3 上傳一個(gè)包 137
5.3.1
PyPIPython包索引 137
5.3.2
源代碼包與構(gòu)建包 139
5.4 獨(dú)立可執(zhí)行文件 142
5.4.1
獨(dú)立可執(zhí)行文件何時(shí)有用 143
5.4.2
常用工具 143
5.4.3
可執(zhí)行包中Python代碼的安全性 150
5.5 小結(jié) 151
第6章 部署代碼 152
6.1 十二要素應(yīng)用 152
6.2 用Fabric進(jìn)行自動(dòng)化部署 154
6.3 你自己的包索引或索引鏡像 158
6.3.1
PyPI鏡像 159
6.3.2
使用包進(jìn)行部署 160
6.4 常見(jiàn)約定與實(shí)踐 168
6.4.1
文件系統(tǒng)層次結(jié)構(gòu) 168
6.4.2
隔離 168
6.4.3
使用進(jìn)程管理工具 169
6.4.4
應(yīng)該在用戶(hù)空間運(yùn)行應(yīng)用代碼 170
6.4.5
使用HTTP反向代理 171
6.4.6
優(yōu)雅地重新加載進(jìn)程 171
6.5 代碼檢測(cè)與監(jiān)控 172
6.5.1
記錄錯(cuò)誤sentry/raven 173
6.5.2
監(jiān)控系統(tǒng)與應(yīng)用指標(biāo) 175
6.5.3
處理應(yīng)用日志 177
6.6 小結(jié) 181
第7章 使用其他語(yǔ)言開(kāi)發(fā)Python擴(kuò)展 182
7.1 使用C或者C 編寫(xiě)擴(kuò)展 182
7.2 為什么你想用擴(kuò)展 184
7.2.1
提高關(guān)鍵代碼段的性能 185
7.2.2
集成現(xiàn)有的使用不同語(yǔ)言編寫(xiě)的代碼 185
7.2.3
集成第三方動(dòng)態(tài)庫(kù) 185
7.2.4
創(chuàng)建自定義數(shù)據(jù)類(lèi)型 186
7.3 編寫(xiě)擴(kuò)展 186
7.3.1
純C擴(kuò)展 187
7.3.2
Cython 201
7.4 挑戰(zhàn) 205
7.4.1
額外的復(fù)雜性 205
7.4.2
調(diào)試 206
7.5 無(wú)擴(kuò)展的動(dòng)態(tài)庫(kù)接口 206
7.5.1
ctypes 207
7.5.2
CFFI 212
7.6 小結(jié) 214
第8章 管理代碼 215
8.1 版本控制系統(tǒng) 215
8.1.1
集中式系統(tǒng) 215
8.1.2
分布式系統(tǒng) 217
8.1.3
集中式還是分布式 219
8.1.4
盡可能使用Git 219
8.1.5
Git工作流程與GitHub工作流程 220
8.2 持續(xù)的開(kāi)發(fā)過(guò)程 223
8.2.1
持續(xù)集成 224
8.2.2
持續(xù)交付 227
8.2.3
持續(xù)部署 227
8.2.4
常用的持續(xù)集成工具 228
8.2.5
選擇正確的工具和常見(jiàn)的陷阱 234
8.3 小結(jié) 236
第9章 文檔化你的項(xiàng)目 237
9.1
7項(xiàng)技術(shù)寫(xiě)作規(guī)則 237
9.1.1
兩步寫(xiě)作 238
9.1.2
定位讀者 238
9.1.3
使用簡(jiǎn)單的風(fēng)格 239
9.1.4
限制信息范圍 240
9.1.5
使用現(xiàn)實(shí)中的代碼示例 240
9.1.6
使用輕量且充分的方法 241
9.1.7
使用模板 241
9.2
reStructuredText入門(mén) 242
9.2.1
章節(jié)結(jié)構(gòu) 243
9.2.2
列表 245
9.2.3
行內(nèi)標(biāo)記 246
9.2.4
文字塊 246
9.2.5
鏈接 247
9.3 構(gòu)建文檔 248
9.4 構(gòu)建自己的文檔集 254
9.4.1
構(gòu)建格局 254
9.4.2
文檔構(gòu)建與持續(xù)集成 259
9.5 小結(jié) 260
第10章 測(cè)試驅(qū)動(dòng)開(kāi)發(fā) 261
10.1
我不測(cè)試 261
10.1.1
測(cè)試開(kāi)發(fā)的原則 261
10.1.2
什么樣的測(cè)試 265
10.1.3
達(dá)式Python標(biāo)準(zhǔn)測(cè)試工具 268
10.2
我做測(cè)試 273
10.2.1
unittest陷阱 273
10.2.2
unittest的替代品 274
10.2.3
測(cè)試覆蓋率 280
10.2.4
仿真與模擬 282
10.2.5
測(cè)試環(huán)境與依賴(lài)兼容性 289
10.2.6
文檔驅(qū)動(dòng)開(kāi)發(fā) 292
10.3
小結(jié) 294
第11章 優(yōu)化一般原則與分析技術(shù) 295
11.1
3個(gè)優(yōu)化規(guī)則 295
11.1.1
首先要能工作 295
11.1.2
從用戶(hù)的角度考慮 296
11.1.3
保持代碼的可讀性和可維護(hù)性 297
11.2
優(yōu)化策略 297
11.2.1
找到另外的罪魁禍?zhǔn)?297
11.2.2
擴(kuò)展硬件 298
11.2.3
編寫(xiě)速度測(cè)試 298
11.3
查找瓶頸 299
11.3.1
分析CPU使用情況 299
11.3.2
分析內(nèi)存使用 307
11.3.3
分析網(wǎng)絡(luò)使用情況 315
11.4
小結(jié) 316
第12章 優(yōu)化一些強(qiáng)大的技術(shù) 317
12.1
降低復(fù)雜度 318
12.1.1
循環(huán)復(fù)雜度 319
12.1.2
大O記法 320
12.2
簡(jiǎn)化 322
12.3
使用集合模塊 323
12.3.1
deque 324
12.3.2
defaultdict 325
12.3.3
namedtuple 326
12.4
架構(gòu)體系的權(quán)衡 327
12.4.1
使用啟發(fā)式和近似算法 327
12.4.2
使用任務(wù)隊(duì)列和延遲
處理 328
12.4.3
使用概率型數(shù)據(jù)結(jié)構(gòu) 331
12.5
緩存 331
12.5.1
確定性緩存 332
12.5.2
非確定性緩存 335
12.5.3
緩存服務(wù) 336
12.6
小結(jié) 338
第13章 并發(fā) 339
13.1
為什么需要并發(fā) 339
13.2
多線(xiàn)程 340
13.2.1
什么是多線(xiàn)程 340
13.2.2
Python如何處理多線(xiàn)程 341
13.2.3
何時(shí)應(yīng)該使用多線(xiàn)程 342
13.3
多進(jìn)程 356
13.4
異步編程 364
13.4.1
協(xié)同多任務(wù)與異步I/O 364
13.4.2
Python中的async和await關(guān)鍵字 365
13.4.3
老Python版本中的asyncio 369
13.4.4
異步編程實(shí)例 369
13.4.5
使用futures將異步代碼同步化 372
13.5
小結(jié) 374
第14章 有用的設(shè)計(jì)模式 376
14.1
創(chuàng)建型模式 376
14.2
結(jié)構(gòu)型模式 379
14.2.1
適配器 380
14.2.2
代理 394
14.2.3
外觀(guān) 395
14.3
行為模式 395
14.3.1
觀(guān)察者 396
14.3.2
訪(fǎng)問(wèn)者 398
14.3.3
模板 400
14.4
小結(jié) 403