近幾年P(guān)ython在機(jī)器學(xué)習(xí)、數(shù)據(jù)分析、運(yùn)維等方面表現(xiàn)十分搶眼,已經(jīng)成為求職必須掌握的主要語言之一。本書分為兩卷,上卷詳解語言(基于Python 3.6),下卷分析標(biāo)準(zhǔn)庫,涵蓋Python編程中的高級(jí)問題,剖析語言相關(guān)背景和實(shí)現(xiàn)方式,幫助讀者用好這一門優(yōu)雅的語言。
人們都認(rèn)為Python簡單易學(xué),但其實(shí)Python 的復(fù)雜程度要遠(yuǎn)高出許多人的設(shè)想,諸多概念被隱藏在看似簡單的代碼背后。這也是Python易學(xué)難精的主要原因。對(duì)一門語言的學(xué)習(xí)如果僅停留在語言規(guī)范層面,經(jīng)不起實(shí)戰(zhàn)的考驗(yàn)。本書試圖從Python 3的解釋器入手,剖析語言背后的實(shí)現(xiàn),幫助讀者修煉Python技能,不僅會(huì)用,還用得好,用得妙。
前言
寫作本書時(shí),我已然擺脫萌新身份,算是稍有經(jīng)驗(yàn)的作者。可即便如此,我依然無法保證本書的內(nèi)容完全正確,且滿足所有人的胃口。顯然,這不可能做到。在我看來,圖書大抵分兩類:學(xué)習(xí)和研究。學(xué)習(xí)類書籍滿足日常學(xué)習(xí)和提升需要,用簡練的語言把問題說清楚。最關(guān)鍵的是有清晰的線索,把散亂的知識(shí)串聯(lián)起來,學(xué)習(xí)者可據(jù)此了解前因后果。至于研究類圖書或論文,則應(yīng)擺脫基礎(chǔ),擺脫語法,重點(diǎn)關(guān)注算法、架構(gòu)、性能,乃至內(nèi)部實(shí)現(xiàn)。所有這些,均以思想為支撐,超脫語言窠臼,構(gòu)建并完善體系。不同于寫散文或小說,技術(shù)類圖書的文字不好組織。自然語言易閱讀,但不便描述有復(fù)雜流程分支的邏輯,易導(dǎo)致歧義。更何況,這其中還有各種轉(zhuǎn)譯帶來的麻煩。故技術(shù)類圖書應(yīng)以自然語言開宗明義,闡述理論與規(guī)則,隨后用代碼對(duì)這段文字進(jìn)行解釋,畢竟代碼先天有描述邏輯的優(yōu)勢。很多書,尤其是英文版的圖書,習(xí)慣于用大量篇幅對(duì)代碼示例做各種講解。我感覺這有些啰唆,想必很少有人去讀第二遍,大家最多也就是用記號(hào)筆畫出重點(diǎn)而已。既然如此,我們?yōu)楹尾恍抛x者能閱讀并理解這些代碼呢?這本來就是程序員吃飯的本錢,最多在關(guān)鍵位置輔以注釋便可。當(dāng)然,閱讀前提怕是要設(shè)定為非入門讀者。好在我一再強(qiáng)調(diào)自己寫的是第二本書,或曰閑書。在本書中,對(duì)于理論層面,我會(huì)嘗試說得明白些。當(dāng)然,書中還會(huì)引入一些類比,這些類比或許不是非常合適,但卻可以加深讀者對(duì)相關(guān)問題的理解,畢竟不是所有人都能明白那些云里霧里的抽象理念。一如上面所言,文字與代碼相輔相成,我們應(yīng)靜下心來用代碼去驗(yàn)證文字背后的含義。在我眼里,代碼也是一種自然語言,縮排跳轉(zhuǎn)仿若圖形,本就是最好的筆記注釋。起碼它離機(jī)器語言上有些距離,是為了便于人類閱讀而發(fā)明的。無論我說得多悅耳動(dòng)聽,這終歸只是一本學(xué)習(xí)筆記,算不上專業(yè),僅適合讀者閑暇時(shí)翻閱一二。關(guān)于本書全套書分為上下兩卷。上卷以語言為主,基本涵蓋語言相關(guān)內(nèi)容,包括語法、測試、調(diào)試,乃至解釋器等層面的基本知識(shí)。下卷計(jì)劃以標(biāo)準(zhǔn)庫、優(yōu)秀擴(kuò)展庫、并發(fā)編程,以及架構(gòu)設(shè)計(jì)展開,算是對(duì)上卷閑書稍加修正。書中示例運(yùn)行環(huán)境:macOS 10.12,CPython 3.6,IPython 6.2鑒于不同運(yùn)行環(huán)境的差異性,示例輸出結(jié)果(尤其是id、內(nèi)存地址等信息)會(huì)有所不同。另外,為閱讀方便,本書對(duì)輸出結(jié)果做了裁剪處理,請以實(shí)際運(yùn)行結(jié)果為準(zhǔn)。讀者定位本書著重于剖析語言的相關(guān)背景和實(shí)現(xiàn)方式,適合有一定 Python 編程基礎(chǔ)的讀者(比如準(zhǔn)備從Python 2.7升級(jí)到Python 3.6環(huán)境的讀者)閱讀。至于初學(xué)者,建議尋找從零開始、循序漸進(jìn)地介紹如何編寫代碼的其他圖書為佳。
聯(lián)系方式鄙人能力有限,書中難免存在錯(cuò)漏之處。讀者如在閱讀過程中發(fā)現(xiàn)任何問題,請與我聯(lián)系,以便更正。謝謝!?郵件:qyuhen@hotmail.com?微博:weibo.com/qyuhen
雨 痕 二〇一七年,仲秋
自 1996 年從事計(jì)算機(jī)軟件開發(fā)工作以來,已 20 春秋。期間供職于北大方正、西單電子商務(wù)、九城數(shù)碼、知乎等公司。主要從事核心開發(fā)、架構(gòu)設(shè)計(jì),以及部分管理工作。
第1章 概述
第2章 類型
2.1 基本環(huán)境
2.1.1 印象
2.1.2 名字
2.1.3 內(nèi)存
2.1.4 編譯
2.1.5 執(zhí)行
2.2 內(nèi)置類型
2.2.1 整數(shù)
2.2.2 浮點(diǎn)數(shù)
2.2.3 字符串
2.2.4 字節(jié)數(shù)組
2.2.5 列表
2.2.6 字典
2.2.7 集合
第3章 表達(dá)式
3.1 詞法
3.1.1 源文件
3.1.2 代碼
3.2 賦值
3.2.1 增量賦值
3.2.2 序列解包
3.2.3 作用域
3.3 運(yùn)算符
3.3.1 鏈?zhǔn)奖容^
3.3.2 切片
3.3.3 邏輯運(yùn)算
3.4 控制流
3.4.1 選擇
3.4.2 循環(huán)
3.5 推導(dǎo)式
第4章 函數(shù)
4.1 定義
4.2 參數(shù)
4.3 返回值
4.4 作用域
4.5 閉包
4.6 調(diào)用
第5章 迭代器
5.1 迭代器概述
5.2 生成器
5.3 模式
5.4 函數(shù)式編程
第6章 模塊
6.1 定義
6.2 導(dǎo)入
6.2.1 搜索
6.2.2 編譯
6.2.3 引用
6.3 包
6.3.1 初始化
6.3.2 相對(duì)導(dǎo)入
6.3.3 拆分
第7章 類
7.1 定義
7.2 字段
7.3 屬性
7.4 方法
7.5 繼承
7.5.1 統(tǒng)一類型
7.5.2 初始化
7.5.3 覆蓋
7.5.4 多繼承
7.5.5 抽象類
7.6 開放類
7.7 運(yùn)算符重載
第8章 異常
8.1 異常概述
8.2 斷言
8.3 上下文
第9章 元編程
9.1 裝飾器
9.1.1 實(shí)現(xiàn)
9.1.2 應(yīng)用
9.2 描述符
9.3 元類
9.3.1 自定義
9.3.2 應(yīng)用
9.4 注解
第10章 進(jìn)階
10.1 解釋器
10.1.1 字節(jié)碼
10.1.2 全局鎖
10.1.3 執(zhí)行過程
10.1.4 內(nèi)存分配
10.1.5 垃圾回收
10.2 擴(kuò)展
10.2.1 ctypes
10.2.2 Cython
第11章 測試
11.1 單元測試
11.1.1 unittest
11.1.2 unittest.mock
11.1.3 coverage
11.2 性能測試
11.2.1 timeit
11.2.2 profile
11.2.3 line profiler
11.2.4 memory profiler
11.2.5 pympler
第12章 工具
12.1 調(diào)試器
12.2 包管理