本書介紹了如何通過Python自動化地完成物理領(lǐng)域方面的研究。全書共分為4個部分,以Python代碼為示例向讀者介紹了如何用Python解決物理項目中出現(xiàn)的各種問題。第 1部分(第 1~6章):起步,介紹Python的基本知識,如命令行、數(shù)據(jù)容器、類和對象等。第 2部分(第7~13章):上手,主要介紹正則表達(dá)式、數(shù)據(jù)可視化、存儲數(shù)據(jù)等實(shí)用知識。第3部分(第 14~18章):完善,介紹如何構(gòu)建流程和軟件、版本控制、調(diào)試和控制代碼等。第4部分(第 19~23章):發(fā)布,介紹如何為代碼生成文檔、如何提高協(xié)作效率和軟件許可證以及版權(quán)的相關(guān)知識等。
本書適合想要通過Python減少工作量的物理學(xué)領(lǐng)域的研究人員閱讀,也適合想要學(xué)習(xí)如何通過Python編程解決物理問題的讀者參考。
許多物理學(xué)家在研究工作中還要扮演軟件開發(fā)人員的角色。但即使對于物理學(xué)家來說,也不是所有的軟件開發(fā)任務(wù)都很簡單。本書是一本實(shí)踐指南,介紹了軟件開發(fā)的許多基本技能,能夠幫助讀者自動化地完成物理領(lǐng)域幾乎所有方面的研究。
本書由兩位核工程博士編寫,書中包含了物理領(lǐng)域的許多實(shí)際案例。通過閱讀本書,讀者會學(xué)到如何用Python編程語言收集、分析數(shù)據(jù),構(gòu)建軟件,發(fā)布結(jié)果等技能。
本書分為4個部分。
起步:掌握Python、命令行、數(shù)據(jù)容器、函數(shù)、流程控制以及邏輯、類和對象。
上手:學(xué)習(xí)正則表達(dá)式、分析和可視化、NumPy、用文件和HDF5存儲數(shù)據(jù)、物理中重要的數(shù)據(jù)結(jié)構(gòu)、并行計算以及部署軟件。
完善:構(gòu)建流程和軟件;使用本地和遠(yuǎn)程版本控制、調(diào)試并測試代碼。
發(fā)布:為代碼生成文檔;發(fā)布研究結(jié)果;提高協(xié)作效率;了解軟件許可證、所有權(quán)和版權(quán)的處理流程。
Anthony Scopatz是計算物理學(xué)家和資 深Python開 發(fā) 者。Anthony擁有加州大學(xué)圣塔芭芭拉分校的理學(xué)學(xué)士學(xué)位,以及得克薩斯大學(xué)奧斯汀分校的機(jī)械/核能博士學(xué)位。Enthought前員工,曾在芝加哥大學(xué)天文物理學(xué)系的Flash Center進(jìn)行博士后研究,目前是威斯康星大學(xué)麥迪遜分校工程物理系的工作人員,主要研究核燃料循環(huán)的基本物理建模、信息理論和熵。Anthony是Python軟件基金會的成員,并在許多會議上進(jìn)行過以科學(xué)和軟件開發(fā)為主題的演講。
Kathryn D.Huff是伯克利數(shù)據(jù)科學(xué)研究所的研究員,也是加州大學(xué)伯克利分校核能科學(xué)與安全聯(lián)盟的博士后研究員。2013年獲得威斯康星大學(xué)麥迪遜分校的核工程博士學(xué)位。她還擁有芝加哥大學(xué)物理學(xué)學(xué)士學(xué)位。她參與了實(shí)驗宇宙天體物理學(xué)、實(shí)驗非平衡粒狀物相動力學(xué)、計算核燃料循環(huán)分析、計算反應(yīng)堆事故中子學(xué)等領(lǐng)域的研究。在威斯康辛州,她是科學(xué)計算機(jī)組織Hacker Within的創(chuàng)始人,自2011年以來一直擔(dān)任Software Carpentry的講師。在專業(yè)的其他方面,她目前是美國核學(xué)會的部門主管,連續(xù)兩年擔(dān)任Scientific Computing with Python (SciPy)會議的程序委員會聯(lián)合主席。
第 一部分 起步
第 1章 命令行簡介 3
1.1 Shell概覽 3
1.1.1 Shell是 一 款編程
語言 4
1.1.2 路徑和pwd 5
1.1.3 主目錄(~) 7
1.1.4 列出內(nèi)容(ls) 8
1.1.5 更改目錄(cd) 9
1.1.6 查看文件內(nèi)容(head
和tail命令) 12
1.2 操作文件和目錄 12
1.2.1 創(chuàng)建文件(nano、emacs、
vi、cat、>、
touch) 12
1.2.2 復(fù)制和重命名文件
(cp和mv) 17
1.2.3 創(chuàng)建目錄
(mkdir) 18
1.2.4 刪除文件和目錄
(rm) 19
1.2.5 標(biāo)志和通配符 21
1.3 獲取幫助 22
1.3.1 閱讀程序手冊
(man) 22
1.3.2 找到正確的
工具(apropos) 24
1.3.3 用重定向和管道組合
多個實(shí)用程序
(>、>>、|) 25
1.4 權(quán)限和共享 26
1.4.1 查看權(quán)限(ls –l) 27
1.4.2 設(shè)置所有權(quán) 28
1.4.3 設(shè)置權(quán)限
(chmod) 29
1.4.4 創(chuàng)建鏈接(ln) 29
1.4.5 連接其他計算機(jī)
(ssh和scp) 30
1.5 環(huán)境 31
1.5.1 保存環(huán)境變量
(.bashrc) 33
1.5.2 運(yùn)行程序
(PATH) 34
1.5.3 別名命令
(alias) 35
1.6 使用bash編寫腳本 36
1.7 本章小結(jié) 38
第 2章 Python編程起步 39
2.1 運(yùn)行Python 40
2.2 注釋 41
2.3 變量 42
2.4 特殊變量 44
2.4.1 布爾值 44
2.4.2 None不是0! 45
2.4.3 NotImplemented
不是None! 45
2.5 操作符 45
2.6 字符串 49
2.6.1 字符串索引 50
2.6.2 字符串連接 52
2.6.3 字符串字面值 53
2.6.4 字符串方法 55
2.7 模塊 56
2.7.1 導(dǎo)入模塊 56
2.7.2 從模塊中導(dǎo)入
變量 57
2.7.3 別名導(dǎo)入 58
2.7.4 導(dǎo)入變量別名 58
2.7.5 包 59
2.7.6 標(biāo)準(zhǔn)庫和Python
生態(tài)系統(tǒng) 61
2.8 本章小結(jié) 62
第3章 基本容器 63
3.1 列表 64
3.2 元組 68
3.3 集合 69
3.4 字典 71
3.5 本章小結(jié) 73
第4章 流程控制和邏輯運(yùn)算 75
4.1 條件語句 75
4.1.1 if-else語句 78
4.1.2 if-elif-else語句 79
4.1.3 if-else表達(dá)式 80
4.2 異常 80
4.2.1 拋出異常 81
4.3 循環(huán) 83
4.3.1 while循環(huán) 83
4.3.2 for循環(huán) 85
4.3.3 解析式 87
4.4 本章小結(jié) 90
第5章 使用函數(shù) 91
5.1 Python中的函數(shù) 91
5.2 關(guān)鍵字參數(shù) 94
5.3 變長參數(shù) 96
5.4 多返回值 98
5.5 作用域 99
5.6 遞歸 102
5.7 lambda 103
5.8 生成器 104
5.9 裝飾器 107
5.10 本章小結(jié) 110
第6章 類和對象 112
6.1 面向?qū)ο?112
6.2 對象 113
6.3 類 117
6.3.1 類變量 118
6.3.2 實(shí)例變量 120
6.3.3 構(gòu)造器 121
6.3.4 方法 123
6.3.5 靜態(tài)方法 126
6.3.6 鴨子類型 127
6.3.7 多態(tài) 128
6.4 裝飾器和元類 132
6.5 本章小結(jié) 134
第 2部分 上手
第7章 分析和可視化 139
7.1 準(zhǔn)備數(shù)據(jù) 139
7.1.1 實(shí)驗數(shù)據(jù) 143
7.1.2 模擬數(shù)據(jù) 144
7.1.3 元數(shù)據(jù) 145
7.2 載入數(shù)據(jù) 145
7.2.1 NumPy 146
7.2.2 PyTables 147
7.2.3 Pandas 147
7.2.4 Blaze 148
7.3 清理和改寫數(shù)據(jù) 149
7.4 分析 153
7.4.1 模型驅(qū)動的分析 154
7.4.2 數(shù)據(jù)驅(qū)動的分析 155
7.5 可視化 156
7.5.1 可視化工具 157
7.5.2 gnuplot 158
7.5.3 matplotlib 160
7.5.4 Bokeh 165
7.5.5 Inkscape 167
7.6 本章小結(jié) 167
第8章 正則表達(dá)式 169
8.1 示例:雜亂的磁性 170
8.2 命令行中的元字符 171
8.2.1 用簡單的模式
列出文件 172
8.2.2 根據(jù)模式全局查找
文件名(find) 173
8.3 grep、sed、awk 179
8.4 在文件中查找模式
(grep) 179
8.5 在文件中查找和替換
(sed) 181
8.5.1 查找和替換復(fù)雜
模式 183
8.5.2 sed額外內(nèi)容 184
8.6 處理數(shù)據(jù)列(awk) 186
8.7 Python正則表達(dá)式 188
8.8 本章小結(jié) 190
第9章 NumPy:以數(shù)組的形式
思考 192
9.1 數(shù)組 193
9.2 dtype 195
9.3 切片和視圖 198
9.4 算術(shù)和廣播 200
9.5 花式索引 204
9.6 掩模 206
9.7 結(jié)構(gòu)數(shù)組 209
9.8 通用函數(shù) 211
9.9 其他有用的函數(shù) 213
9.10 本章小結(jié) 215
第 10章 數(shù)據(jù)存儲:文件和
HDF5 216
10.1 Python中的文件 217
10.2 關(guān)于計算機(jī)架構(gòu)的一些說明 221
10.3 HDF5中的重要思想 223
10.4 文件處理 225
10.5 層次布局 227
10.6 分塊 229
10.7 核內(nèi)和核外操作 233
10.7.1 核內(nèi) 233
10.7.2 核外 234
10.8 查詢 235
10.9 壓縮 236
10.10 HDF5工具 237
10.11 本章小結(jié) 239
第 11章 物理中重要的數(shù)據(jù)
結(jié)構(gòu) 240
11.1 散列表 240
11.1.1 調(diào)整大小 242
11.1.2 沖突 243
11.2 數(shù)據(jù)框 245
11.2.1 Series 246
11.2.2 DataFrame結(jié)構(gòu) 247
11.3 B數(shù) 250
11.4 k-d樹 252
11.5 本章小結(jié) 256
第 12章 并行化執(zhí)行 258
12.1 規(guī)模和擴(kuò)展能力 259
12.2 問題分類 261
12.3 示例:N體問題 262
12.4 非并行 263
12.5 線程 267
12.6 多處理 273
12.7 MPI 276
12.8 本章小結(jié) 281
第 13章 軟件部署 283
13.1 部署軟件本身 284
13.1.1 pip 285
13.1.2 Conda 289
13.1.3 虛擬機(jī) 292
13.1.4 Docker 293
13.2 部署到云端 297
13.3 在超算上部署 299
13.4 本章小結(jié) 300
第3部分 完善
第 14章 構(gòu)建流程和軟件 305
14.1 make 306
14.1.1 運(yùn)行make 308
14.1.2 makefile 308
14.1.3 目標(biāo) 309
14.1.4 特殊目標(biāo) 311
14.2 構(gòu)建和運(yùn)行軟件 312
14.2.1 Makefile配置 313
14.2.2 編譯 316
14.3 安裝 316
14.4 本章小結(jié) 317
第 15章 本地版本控制 318
15.1 什么是版本控制 318
15.1.1 計算物理中的
實(shí)驗室筆記本 319
15.1.2 版本控制工具的
類型 320
15.2 Git起步 320
15.2.1 安裝Git 321
15.2.2 獲取幫助 321
15.2.3 控制Git的行為
(git config) 322
15.3 使用Git進(jìn)行本地版本
控制 323
15.3.1 創(chuàng)建本地庫
(git init) 323
15.3.2 暫存文件 325
15.3.3 檢查本地副本的狀態(tài)
(git status) 326
15.3.4 保存快照
(git commit) 326
15.3.5 git log:查看
歷史 329
15.3.6 查看改動
(git diff) 329
15.3.7 取消暫存或回滾文件
(git reset) 330
15.3.8 丟棄提交
(git revert) 331
15.3.9 列出、創(chuàng)建、刪除分
支(git branch) 332
15.3.10 切換分支
(git checkout) 334
15.3.11 合并分支
(git merge) 334
15.3.12 處理沖突 336
15.4 本章小結(jié) 336
第 16章 遠(yuǎn)程版本控制 337
16.1 代碼托管(github.com) 337
16.2 在GitHub上創(chuàng)建
代碼庫 339
16.3 聲明遠(yuǎn)程庫
(git remote) 339
16.4 向遠(yuǎn)程庫發(fā)送提交
(git push) 340
16.5 下載代碼庫
(git clone) 341
16.6 從遠(yuǎn)程庫獲取內(nèi)容
(git fetch) 344
16.7 合并遠(yuǎn)程庫的內(nèi)容
(git merge) 345
16.8 Pull等于Fetch加Merge
(git pull) 345
16.9 沖突 346
16.10 解決沖突 347
16.11 本章小結(jié) 348
第 17章 調(diào)試 350
17.1 遇到一個bug 351
17.2 print語句 352
17.3 交互式調(diào)試 354
17.4 在Pythong中調(diào)試
(pdb) 355
17.4.1 設(shè)置跟蹤點(diǎn) 356
17.4.2 步進(jìn) 357
17.4.3 查詢變量 358
17.4.4 設(shè)置狀態(tài) 358
17.4.5 運(yùn)行函數(shù)和
方法 359
17.4.6 繼續(xù)執(zhí)行 359
17.4.7 斷點(diǎn) 360
17.5 剖析 360
17.5.1 使用pstats查看
剖析文件 361
17.5.2 可視化查看剖析
信息 361
17.5.3 使用Kernprof剖析
代碼 364
17.6 linting 365
17.7 本章小結(jié) 366
第 18章 測試 368
18.1 為什么要做測試 369
18.2 什么時候?qū)憸y試 369
18.3 在哪里編寫測試 370
18.4 如何測試?測試哪些
內(nèi)容 370
18.5 運(yùn)行測試 373
18.6 邊界情形 374
18.7 單元測試 376
18.8 集成測試 378
18.9 回歸測試 380
18.10 測試生成器 380
18.11 測試覆蓋 382
18.12 測試驅(qū)動開發(fā) 383
18.13 本章小結(jié) 386
第4部分 發(fā)布
第 19章 文檔 389
19.1 為什么文檔很重要 389
19.1.1 文檔非常有價值 390
19.1.2 編寫文檔比想象的
要簡單 390
19.2 文檔類型 391
19.2.1 理論手冊 391
19.2.2 用戶和開 發(fā) 者
指南 392
19.2.3 readme文件 392
19.2.4 注釋 393
19.2.5 自文檔代碼 395
19.2.6 文檔字符串 396
19.3 自動化 397
19.4 本章小結(jié) 401
第 20章 出版 402
20.1 文檔處理 403
20.1.1 格式和內(nèi)容
分離 403
20.1.2 跟蹤改動 404
20.2 文本編輯器 404
20.3 標(biāo)記語言 405
20.3.1 LaTeX 406
20.3.2 參考文獻(xiàn) 416
20.4 本章小結(jié) 419
第 21章 協(xié)作 421
21.1 任務(wù)單系統(tǒng) 422
21.1.1 工作流程概覽 422
21.1.2 創(chuàng)建問題 424
21.1.3 分配問題 425
21.1.4 討論問題 426
21.1.5 關(guān)閉問題 427
21.2 拉取請求和代碼審查 427
21.2.1 提交拉取請求 428
21.2.2 審查合并請求 428
21.2.3 合并拉取請求 429
21.3 本章小結(jié) 429
第 22章 許可證、所有權(quán)和
版權(quán) 430
22.1 哪些內(nèi)容可賦予版權(quán) 431
22.2 首 次發(fā)布權(quán) 431
22.3 什么是公共領(lǐng)域 432
22.4 選擇一個軟件許可證 432
22.5 伯克利軟件發(fā)布
許可證(BSD) 434
22.6 GNU General Public
License (GPL) 436
22.7 知識共享(CC) 437
22.8 其他許可證 438
22.9 更換許可證 440
22.10 版權(quán)不是一切 441
22.11 本章小結(jié) 442
第 23章 關(guān)于計算物理進(jìn)一步
思考 443
術(shù)語 447