書名:流暢的Python作者:[巴西] Luciano Ramalho譯者:安道 吳珂ISBN:978-7-115-45415-7 需要學習的朋友可以通過網盤下載pdf版 http://tadown.com/fs/cyibbebnsahu08034/ 目標讀者本書的目標讀者是那些正在使用 Pytho ...
書名:流暢的Python
作者:[巴西] Luciano Ramalho
譯者:安道 吳珂
ISBN:978-7-115-45415-7
需要學習的朋友可以通過網盤下載pdf版 http://tadown.com/fs/cyibbebnsahu08034/
目標讀者
本書的目標讀者是那些正在使用 Python,又想熟悉 Python 3 的程式員。
如果你懂 Python 2,但是想遷移到 Python 3.4 或者更新的版本,也沒問
題。在寫這本書的時候,大多數專業 Python 程式員用的還是 Python 2,
因此如果書中出現來自 Python 3 的特性,讀者可能會感到陌生,我也會
特別地做出解釋。
然而,本書的主要目的是為了充分地展現 Python 3.4 的魅力,因此我不
會一字一句地說明如何讓本書的代碼在舊版本里正常運行。本書中的大
多數例子稍做修改(甚至不用修改)就可以在 Python 2.7 裡面跑起來,
但是有些例子,如果追求向下相容,就會需要大量的重寫。
話雖如此,我還是認為,即便你無法從 Python 2.7 里脫身,這本書也會
對你很有幫助,因為 Pyhon 語言的核心概念是不會變的。Python 3 也不
是一門全新的語言,大多數的改動花一下午大概就能適應,官方文檔
里“Python 3.0 的新特性”一節
(https://docs.python.org/3.0/whatsnew/3.0.html)就是很好的切入點。固
然,自 2009 年發佈以來,Python 3.0 也在變化,但是這些變化比起
Python 3.0 和 Python 2.0 之間的區別,並沒有那麼重要。
如果你尚不清楚自己對 Python 的熟悉程度能否跟得上本書的內容,建議
你回頭看看 Python 的官方教程。註意,除非是跟 Python 3 的新特性有
關,教程里的其他內容本書不會重覆。
非目標讀者
如果你才剛剛開始學 Python,本書的內容可能會顯得有些“超綱”。比難
懂更糟的是,如果在學習 Python 的過程中過早接觸本書的內容,你可能
會誤以為所有的 Python 代碼都應該利用特殊方法和元編程
(metaprogramming)技巧。我們知道,不成熟的抽象和過早的優化一
樣,都會壞事。
本書的結構
如果你是本書的目標讀者,那你應該可以從本書的任意一章開始閱讀,
但是如果按照我寫作時的構思來的話,本書一共分為六個獨立的部分,
每個部分內的章節最好按照順序來讀。
在介紹讓你自己實現某些功能的方法之前,我通常會先把現成可用的工
具講清楚。比如說第二部分的第 2 章覆蓋了序列類型(sequence
type),但是像 collections.deque 這種類可能就會一帶而過。一直
到第四部分,我們才會看看如何從抽象基類(abstract base class,
ABC)中獲利,抽象基類則被封裝在 collections.abc 這個包里。如
果想創建自己的 ABC,你可能得看到第四部分的最後一些內容才行,
因為我一直覺得,如果沒有熟練使用 ABC 的經驗,貿然去實現一套自
己的東西是不合適的。
這樣做有幾個好處。第一,知道有什麼現成的工具可用,能避免重新發
明輪子。畢竟我們使用現有集合類型(collection type)的概率要遠大於
自己動手寫一套新的。第二,這樣一來,在討論如何寫新類型之前,我
們能夠有更多的機會來瞭解這些現成類的高級用法。第三,比起從零開
始構建一個 ABC,繼承已有的 ABC 庫應該會簡單一些。最後,我認為
在看過一些實際的案例之後,理解抽象會更輕鬆。
當然,這樣也會帶來一些不便之處,比如書里的向前引用就會分散在各
個不同的章節裡面。但是經過上述這番梳理,我想這一點不便之處也是
可以容忍的。
下麵是本書每一部分的主題。
第一部分
第一部分只有單獨的一章,講解的是 Python 的數據模型(data
model),以及如何為了保證行為一致性而使用特殊方法(比如
__repr__),畢竟 Python 的一致性是出了名的。其實整本書幾乎都是
在講解 Python 的數據模型,第 1 章算是一個概覽。
第二部分
第二部分包含了各種集合類型:序列(sequence)、映射
(mapping)和集合(set),另外還提及了字元串(str)和位元組序列
(bytes)的區分。說起來,最後這一點也是讓親者(Python 3 用戶)
快,仇者(Python 2 用戶)痛的一個關鍵,因為這個區分致使 Python 2
代碼遷移到 Python 3 的難度陡增。第二部分的目標是幫助讀者回憶起
Python 內置的類庫,順帶解釋這些類庫的一些不太直觀的地方。具體的
例子有 Python 3 如何在我們觀察不到的地方對 dict 的鍵重新排序,或
者是排序有區域(locale)依賴的字元串時的註意事項。為了達到本部
分的目標,有些地方的講解會比較大而全,像序列類型和映射類型的變
種就是這樣;有時則會寫得很深入,比方說我會對 dict 和 set 底層的
散列表進行深層次的討論。
第三部分
如何把函數作為一等對象(first-order object)來使用。第三部分首
先會解釋前面這句話是什麼意思,然後話題延伸到這個概念對那些被廣
泛使用的設計模型的影響,最後讀者會看到如何利用閉包(closure)的
概念來實現函數裝飾器(function decorator)。這一部分的話題還包括
Python 的這些基本概念:可調用(callable)、函數屬性(function
attribute)、內省(introspection)、參數註解(parameter annotation)和
Python 3 里新出現的 nonlocal 聲明。
第四部分
到了這裡,書的重點轉移到了類的構建上面。雖然在第二部分里的
例子里就有類聲明(class declaration)的出現,但是第四部分會呈現更
多的類。和任何面向對象語言一樣,Python 還有些自己的特性,這些特
性可能並不會出現在你我學習基於類的編程的語言中。這一部分的章節
解釋了引用(reference)的原理、“可變性”的概念、實例的生命周期、
如何構建自定義的集合類型和 ABC、多重繼承該怎麼理順、什麼時候
應該使用操作符重載及其方法。
第五部分
Python 中有些結構和庫不再滿足於諸如條件判斷、迴圈和子程式
(subroutine)之類的順序控制流程,第五部分的筆墨會集中在這些構造
和庫上。我們會從生成器(generator)起步,然後話題會轉移到上下文
管理器(context manager)和協程(coroutine),其中會涵蓋新增的功能
強大但又不容易理解的 yield from 語法。這一部分以併發性和麵向事
件的 I/O 來結尾,其中跟併發性相關的是 collections.futures 這個
很新的包,它藉助 futures 包把線程和進程的概念給封裝了起來;而
跟面向事件 I/O 相關的則是 asyncio,它的背後是基於協程和 yield
from 的 futures 包。
第六部分
第六部分的開頭會講到如何動態創建帶屬性的類,用以處理諸如
JSON 這類半結構化的數據。然後會從大家已經熟悉的特性(property)
機制入手,用描述符從底層來解釋 Python 對象屬性的存取。同時,函
數、方法和描述符的關係也會被梳理一遍。第六部分會從頭至尾地實現
一個欄位驗證器,在這個過程中我們會遇到一些微妙的問題,然後在最
後一章中就自然引出像類裝飾器(class decorator)和元類(metaclass)
這些高級的概念。
以實踐為基礎
一般情況下,我們會用 Python 的互動式控制台來探索各種庫和語言本
身。有些讀者可能對靜態的需要編譯的語言更熟悉,但是這些語言可能
不會提供 REPL(read-eval-print loop,讀取、求值、輸出的迴圈)。在
這裡我想強調一下 Python 互動式控制台,也就是 REPL,作為一個學習
工具的重要性。
doctest(https://docs.python.org/3/library/doctest.html)是 Python 的一個標
準庫,做測試用的。這個庫通過模擬控制台對話來檢驗表達式求值是否
正確,而本書中幾乎所有代碼的測試,包括那些在控制台里的輸出,都
是通過這個庫來進行的。doctest 看起來就像是 Python 互動式控制台的劇
本,你甚至都不需要瞭解它背後的運行機制就可以直接用它來試驗書里
的例子。
我有時為了事先說明一段代碼的目的,會在展示代碼之前先擺出相應的
doctest 文本。這是因為我認為,在考慮如何實現一個功能之前,先嚴格
地列出這個功能能做什麼,這能幫助我們在編程時把精力花在該花的地
方。測試驅動開發(TDD)的精髓就是先寫測試,我後來發現這種精神
在教學中也是大有益處的。如果你對 doctest 還不熟悉,花點時間閱讀
它的文檔(https://docs.python.org/3/library/doctest.html)。結合本書的源
碼(https://github.com/fluentpython/example-code),你可以在操作系統的
控制台里鍵入 python3 -m doctest example_script.py 來驗證書
中幾乎所有代碼的正確性。
硬體
書中有一些簡單的時間和基準測試,跑這些測試的時候我用的是寫書時
的兩台筆記本電腦。一臺是產於 2011 年的 MacBook Pro 13 英寸筆記
本,配置是 2.7 GHz 的英特爾 Core i7 處理器、8GB 的記憶體和機械硬
盤;另一臺是產於 2014 年的 MacBook Air 13 英寸筆記本,配置是 1.4
GHz 的英特爾 Core i5 處理器、4GB 記憶體和一個固態硬碟。MacBook Air
的處理器雖然慢一些,記憶體也沒有另一臺多,但是它的記憶體快一些
(1600 MHz,MacBook Pro 13 英寸則是 1333 MHz),另外它的硬碟也
更快,因此在日常使用中我並沒有感覺到兩台筆記本有速度上的差異。
雜談:個人的一點看法
從 1998 年起,我一直在使用 Python,也做 Python 教學,另外還一直在
為它辯護。我一直都很享受這個過程,尤其是喜歡研究 Python 同其他語
言在設計和理論上的不同。因此在有些章節的最後,我會加上一點自己
對 Python 以及其他語言的看法,我把這部分叫作“雜談”。如果你對這些
東西不感興趣,跳過即可,因為這些並不是必讀的。
第 1 章 Python 數據模型
第 2 章 序列構成的數組
第 3 章 字典和集合
第 4 章 文本和位元組序列
第 5 章 一等函數
第 6 章 使用一等函數實現設計模
式
第 7 章 函數裝飾器和閉包
第 8 章 對象引用、可變性和垃圾
回收
第 9 章 符合Python風格的對象
第 10 章 序列的修改、散列和切
片
第 11 章 介面:從協議到抽象基
類
第 12 章 繼承的優缺點
第 13 章 正確重載運算符
第 14 章 可迭代的對象、迭代器
和生成器
第 15 章 上下文管理器和 else 塊
第 16 章 協程
第 17 章 使用期物處理併發
第 18 章 使用 asyncio 包處理並
發
第 19 章 動態屬性和特性
第 20 章 屬性描述符
第 21 章 類元編程