2.42. 小结

你已经走过了在为 OpenMV Cam 编写脚本时会不断用到的那些 Python 部分:

  • 语言基础 —— 值与变量、算术与比较、字符串与字节、四种核心集合(listtupledictset)、条件与循环、定义函数并管理其参数和作用域、定义类与使用继承、抛出与处理异常。这些是其他每一部分 Python 所依赖的基石。

  • 结构性部件 —— 将代码拆分到多个模块和包中、按需导入、用 with 读写文件、通过 json 交换结构化数据,以及通过 struct 打包带有字节序和定宽整数字段的二进制记录。一旦脚本规模超过单个文件,或需要与外部某物通信,这些就会派上用场。

  • 在受限运行时上会改变形态的部分 —— 为什么 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 用于在普通列表之上回答“最小的是哪个”或“最紧急的是哪个”这类问题。每一个都填补了四种核心容器类型留下的一处空白。

  • 日常工作流工具 —— 推导式用于从已有集合构建集合、生成器与迭代器协议用于惰性处理数据、装饰器与上下文管理器用于封装常见的获取/释放及前/后模式,以及那些把出错脚本变成修好脚本的调试习惯(阅读回溯、repr()dir()help()logging 模块)。

2.42.1. 稍后使用本入门指南

请把这份入门指南当作参考资料,而不是一遍读完就完事的读物。各章节有意写得简短;回头复习切片、上下文管理器或推导式正是其设计用途。把你最常翻看的那一节加入书签。

如果稍后摄像头的文档引用了某个你不认识的 Python 概念——比如说“这会返回一个上下文管理器”或“迭代这个结果”——那么对应的入门指南页面就是开始查阅的地方。

2.42.2. 下一步去哪里

基础硬件控制直接建立在你现在掌握的 Python 之上。入门指南活在内存里,而硬件控制活在物理世界中——引脚上的电压、导线上的脉冲、通过总线时钟驱动发往其他芯片的字节。工具集转向了 machine 模块以及一层薄薄的电子知识。入门指南中的一切都会延续下来;你不必重新学习 defwith,也不必重新学习 bytearraybytes 有何不同。

当你在硬件内容中遇到某个感觉陌生的 Python 特性时,这份入门指南就是回来查阅的地方。