2.42. 總結

你已逐一走過為 OpenMV Cam 撰寫指令碼時會不斷用到的 Python 各個部分:

  • 語言基礎 —— 值與變數、算術與比較、字串與位元組、四種核心集合(listtupledictset)、條件式與迴圈、定義函式並管理其引數與作用域、定義類別與運用繼承、引發與處理例外。這些是其他所有 Python 部分賴以建構的基石。

  • 結構性元件 —— 將程式碼拆分到各個模組與套件中、匯入所需內容、使用 with 讀寫檔案、透過 json 交換結構化資料,以及透過 struct 以位元組順序(endianness)與固定寬度整數欄位封裝二進位記錄。當指令碼成長到超過單一檔案,或需要與外部事物溝通時,這些便會登場。

  • 在受限執行環境上會改變樣貌的部分 —— 為何 MicroPython 的浮點數是 32 位元以及如何可靠地比較它們、垃圾回收器如何發放與回收記憶體區塊、為何在小型堆積上碎片化很重要,以及預先配置如何讓長時間執行的指令碼保持良好運作。桌面環境的習慣在此有時會誤導你;本材料為運行於裝置上的程式碼提供了正確的心智模型。

  • 自省與動態程式碼工具 —— id()hash()isinstance()issubclass()callable()globals()locals() 用於 檢視 值與環境;eval() / exec() / compile() 則用於在執行階段產生程式碼才是正確答案的少數情況。大多數指令碼從不碰觸這些,但知道它們的存在(以及何時不該使用它們)是閱讀他人 Python 程式碼的一部分。

  • 文字的模式比對 —— re 模組用於那些你能描述其形式但無法列舉的字串。字元類別、量詞、捕捉群組、錨點,以及貪婪與惰性的取捨,連同 MicroPython 的子集相較於 CPython 有所不足的特定之處。當 str.findstr.split 無計可施時,就採用它。

  • 超越內建型別的容器 —— collections.namedtuple() 用於具型別的記錄、collections.deque 用於有界環形緩衝區與滾動視窗、collections.OrderedDict 用於插入順序屬於相等性一部分的情況,以及 heapq 用於在普通串列上回答「最小的是什麼」或「最緊急的是什麼」之類的問題。每一種都填補了四種核心容器型別所遺留的缺口。

  • 日常工作流程工具 —— 用於從既有集合建構新集合的綜合運算(comprehension)、用於惰性處理資料的產生器與迭代器協定、用於包裝常見取得/釋放與前置/後置模式的裝飾器與情境管理器,以及那些能把壞掉的指令碼變成修好的指令碼的除錯習慣(閱讀回溯訊息、repr()dir()help()logging 模組)。

2.42.1. 日後運用本入門指南

請把這份入門指南當作參考材料,而非一次讀完就丟。各章節刻意簡短;回頭重溫切片、情境管理器或綜合運算正是它的預期用途。為你最常翻閱的章節加上書籤。

如果相機文件日後提及某個你不認得的 Python 概念——比方說「這會回傳一個情境管理器」或「迭代結果」——對應的入門指南頁面就是著手之處。

2.42.2. 接下來何去何從

基礎硬體控制 直接建立在你現在已掌握的 Python 之上。入門指南活在記憶體中,而硬體控制則活在實體世界裡——接腳上的電壓、線路上的脈衝、透過匯流排傳送到其他晶片的位元組。工具組轉向 machine 模組與一層薄薄的電子學。入門指南中的一切都會延續下去;你不必重新學習 defwith,也不必重學 bytearraybytes 有何不同。

當你在硬體材料中遇到某個感到陌生的 Python 功能時,這份入門指南就是回頭查閱之處。