「Fluent Python」今年最佳技術書籍

海鳥發表於2017-10-15

Fluent Python 讀書手記

  • Python資料模型:特殊方法用來給整個語言模型特殊使用,一致性體現。如:__len__, __getitem__
  • AOP: zope.inteface
  • 列表推導(list comprehensive)和 表示式生成器(generator expression),分別用 [...] 和 (...)表未。後者是迭代生成,更節省記憶體。
  • 元組tuple兩大功能特性:不可變、用作資料記錄結構(位置資訊)。元組裡的元素最好也是不可變資料。
  • array 和 列表相比的區別和優勢。array只能存單一資料型別,比如array[int],而列表是任何資料型別的容器。但是array在儲存上更節約記憶體,因為實現就是分配連續的記憶體記錄二進位制資料表示。
  • dict的 setdefault,可以方便處理可能不存在鍵的值操作。
  • dict的鍵是可雜湊的,滿足三個條件。支援hash()函式,通過__hash__實現;通過 __eq__ 檢測相等性;若 a == b,則 hash(a) == hash(b)
  • 接收函式引數或者返回函式的函式可以稱為高階函式
  • 自定義類中重寫 __call__( ) 方法,可以把類例項變為可直接呼叫的函式物件。
  • python中的inspect模組,提供了很多內省方法,像java的reflect包。six庫。
  • operator 和 functools 模組中有很多定義好的高階函式可以,方便編寫函式式程式碼風格。
  • 抽象類可以繼承abc.ABC,使用 @abstractmethod 修飾。
  • 因為在Python中函式也是物件,可以用來傳參和返回,所以23經典設計模式在Python中可能不完全適用,或者以更簡單的方式使用。
  • 裝飾器函式是匯入模組時(load module)時就執行,而不是執行時執行。這個特性可用於框架處理一些啟動註冊的工作。
  • 在巢狀函式中,如果要引用外部的不可變象並重新賦值,則需要使用 nolocal 關鍵字宣告變數再操作。
  • functools.lru_cache 可以快取某個計算代價很大的函式結果。
  • functools.singledispatch 可以寫出類似Java中方法過載的程式碼
  • @classmethod 和 @staticmethod 的區別。前者第一個引數是Class本身,後者就是一普通函式。
  • @Property 設定getter/setter屬性
  • Python中介面,是指“鴨子型別”協議,即一個類具有相似的行為,但跟繼承沒有什麼關係。但是抽象類(介面)在現實世界中是存在的,所以可以通過 abc.ABC 來定義抽象基類。
  • 不要直接繼承內建的類,比如 list, dict。因為繼承內建類,子類重寫的方法如果通過python協議呼叫,不會使用子類的方法。比如 A extends list, A重寫了 __len__,但是呼叫 len(a) 還是使用list的內建方法。解決辦法是使用 pypy中的類,比如collections.abc中的類。
  • for/while/try - else 更應該按 for/while/try - then 語義理解更好些。
  • GIL指CPython實現一次只允許使用一個執行緒執行Python位元組碼,因為CPython直譯器本來不是安全的。但是對於IO密集型場景無害,因為標準庫中所有阻塞IO都會釋放GIL(global interpreter locl)。但是CPU密集型計算則會有影響。

相關文章