第1章 Pythonic 思維做法 01 了解你使用的是哪個版本的 Python做法 02 遵循 PEP 8 風格指南做法 03 永遠不要預期 Python 會在編譯時期偵測錯誤做法 04 撰寫輔助函式而非複雜的運算式做法 05 比起透過索引,請優先選用多重指定的拆分做法 06 始終用括弧圍住單元素的元組做法 07 考慮使用條件運算式來處理簡單的行內邏輯做法 08 使用指定運算式來防止重複做法 09 考慮在流程控制中使用 match 進行解構;如果 if 述句就足夠,則避免使用第2章 字串和切片做法 10 了解 bytes 與 str 之間的差異做法 11 優先選用內插的 F-String,而非 C 式格式字串和 str.format做法 12 列印物件時,要知道 repr 和 str 之間的差異做法 13 偏好明確的字串串接,而非隱含的串接,特別是在串列中做法 14 知道如何切割序列做法 15 避免在單一運算式中同時使用跨步(Striding)和切片做法 16 優先選用捕捉全部的拆分,而非切片第3章 迴圈與迭代器做法 17 優先選用 enumerate,而不是 range做法 18 使用 zip 平行處理迭代器做法 19 避免 for 和 while 迴圈之後的 else 區塊做法 20 永遠別在迴圈結束後使用 for 的迴圈變數做法 21 迭代引數時要做好防禦做法 22 絕對不要在迭代容器時修改它們;改用複本或快取做法 23 將迭代器傳遞給 any 和 all,以實現有效率的短路邏輯做法 24 考慮使用 itertools 來處理迭代器和產生器第4章 字典做法 25 依賴字典插入順序時,請務必謹慎做法 26 優先選用 get 而非 in 和 KeyError 來處理缺少的字典鍵值做法 27 偏好使用 defaultdict 而非 setdefault 來處理內部狀態中缺少的項目做法 28 了解如何使用 __missing__ 建構依存於鍵值的預設值做法 29 使用類別取代深層內嵌的字典、串列和元組第5章 函式做法 30 知道函式引數是可以變動的做法 31 回傳專用的結果物件,而非要求函式呼叫者拆分三個以上的變數做法 32 偏好提出例外,而非回傳 None做法 33 了解 Closure 如何與變數範疇和 nonlocal 互動做法 34 使用數目可變的位置引數減少視覺雜訊做法 35 藉由關鍵字引數提供可選行為做法 36 使用 None 和 Docstring 來指定動態預設引數做法 37 使用僅限關鍵字引數和僅限位置引數來確保程式碼清楚易懂做法 38 使用 functools.wraps 定義函式裝飾器做法 39 對於黏合用的函式,請優先選用 functools.partial 而非 lambda 運算式第6章 概括式和產生器做法 40 使用概括式取代 map 和 filter做法 41 避免在概括式中使用超過兩個控制子運算式做法 42 利用指定運算式減少概括式中的重複做法 43 考慮使用產生器而非回傳串列做法 44 考慮使用產生器運算式來處理大型串列概括式做法 45 用 yield from 組合多個產生器做法 46 將迭代器作為引數傳遞給產生器,而非呼叫 send 方法做法 47 使用類別管理迭代式狀態變遷,而非產生器的 throw 方法第7章 類別與介面 做法 48 對於簡單的介面,請接受函式而非類別做法 49 優先採用物件導向的多型機制,而非帶有 isinstance 檢查的函式做法 50 考慮使用 functools.singledispatch 進行函式型風格的程式設計,取代物件導向的多型做法 51 定義輕量化類別時,請優先選用 dataclasses做法 52 使用 @classmethod 的多型機制以泛型的方式建構物件做法 53 使用 super 初始化父類別做法 54 考慮使用 Mix-in 類別來組合功能做法 55 優先選用公開屬性而非私有屬性做法 56 偏好使用 dataclasses 來建立不可變的物件做法 57 繼承 collections.abc 的類別以建立自訂的容器型別第8章 元類別與屬性做法 58 使用普通的屬性,而非設值器和取值器方法做法 59 考慮使用 @property,而非重構屬性做法 60 使用描述器來實現可重複使用的 @property 方法做法 61 使用 __getattr__、__getattribute__ 和 __setattr__ 實現惰性屬性做法 62 使用 __init_subclass__ 驗證子類別做法 63 使用 __init_subclass__ 註冊類別的存在做法 64 使用 __set_name__ 來注釋類別屬性做法 65 考慮以類別主體定義順序來確立屬性之間的關係做法 66 對於可組合的類別擴充,請優先選用類別裝飾器而非元類別第9章 共時性和平行處理做法 67 使用 subprocess 來管理子行程做法 68 針對會造成阻斷的 I/O 使用執行緒;避免用於平行處理做法 69 使用 Lock 來預防執行緒之間的資料競態做法 70 使用 Queue 來協調執行緒之間的工作做法 71 知道何時需要共時性做法 72 避免為視需要增加的扇出創建新的 Thread 實體做法 73 了解將 Queue 用於共時性會需要怎樣的重構做法 74 非得將執行緒用於共時性時,考慮使用 ThreadPoolExecutor做法 75 藉由協程實現高度共時的 I/O做法 76 知道如何將分緒的 I/O(Threaded I/O)移植到 asyncio做法 77 混合執行緒與協程,以簡化轉換至 asyncio 的工作做法 78 利用對 async 友善的工作者執行緒最大化 asyncio 事件迴圈的回應性做法 79 考慮使用 concurrent.futures 實現真正的平行處理第10章 穩健性做法 80 善用 try/except/else/finally 中的每個區塊做法 81 使用 assert 斷言內部假設並以 raise 提出未符合預期之處做法 82 考慮使用 contextlib 與 with 述句以達成可重複使用的 try/finally 行為做法 83 務必讓 try 區塊盡可能簡短做法 84 小心會消失的例外變數做法 85 捕捉 Exception 類別時務必小心做法 86 了解 Exception 和 BaseException 之間的差異做法 87 使用 traceback 強化例外回報做法 88 考慮明確地鏈串例外以釐清回溯追蹤做法 89 始終將資源(Resources)傳入產生器中,並讓呼叫者在外部清理它們做法 90 絕不要將 __debug__ 設為 False做法 91 除非你正在建置開發人員工具,否則應避免使用 exec 和 eval第11章 效能做法 92 最佳化前,請先進行效能評測做法 93 使用 timeit 微型基準化分析來最佳化關鍵效能程式碼做法 94 了解何時應改用其他程式語言來取代 Python,並知道該怎麼做做法 95 考慮使用 ctypes 與原生程式庫快速整合做法 96 考慮使用擴充模組來最佳化效能和開發者體驗做法 97 仰賴預先編譯的位元組碼與檔案系統快取來改善啟動時間做法 98 使用動態匯入來惰性載入模組以減少啟動時間做法 99 考慮透過 memoryview 和 bytearray 與 bytes 進行零拷貝互動第12章 資料結構與演算法做法 100 使用 key 參數來以複雜的條件進行排序做法 101 了解 sort 與 sorted 之間的差異做法 102 考慮使用 bisect 搜尋排序好的序列做法 103 優先選用 deque 作為 Producer–Consumer 佇列做法 104 知道如何使用 heapq 建立優先序佇列做法 105 針對本地時間,請使用 datetime 而非 time做法 106 當精確度至關重要時,請使用 decimal做法 107 透過 copyreg 讓 pickle 序列化保有可維護性第13章 測試與除錯做法 108 在 TestCase 的子類別中驗證相關行為做法 109 偏好整合測試而非單元測試做法 110 使用 setUp、tearDown、setUpModule 和 tearDownModule 將測試彼此隔離做法 111 使用模擬功能來測試具有複雜依存關係的程式碼做法 112 將依存關係封裝起來以利模擬與測試做法 113 使用 assertAlmostEqual 控制浮點測試中的精確度做法 114 考慮使用 pdb 進行互動式除錯做法 115 使用 tracemalloc 來了解記憶體用量(Memory Usage)與洩漏(Leaks)情況第14章 協作做法 116 知道在哪裡可以找到社群建置的模組做法 117 使用虛擬環境以達成獨立且可重現的依存關係做法 118 為每個函式、類別和模組撰寫 Docstring做法 119 使用套件來組織模組並提供穩定的 API做法 120 考慮使用模組範疇程式碼來設定部署環境做法 121 定義一個根例外以隔離呼叫端與 API做法 122 知道如何打破循環依存關係做法 123 考慮使用 warnings 來重構及遷移用法做法 124 考慮透過 typing 進行靜態分析以消除臭蟲做法 125 捆裝 Python 程式時,優先選擇開源專案而非 zipimport 與 zipapp
Python極客實驗室 |程式設計師的奇想計畫 第二版 Python風格徹底研究|超詳實、好理解的Python必學主題 Think Python|學習程式設計的思考概念 第三版