基于 Pexpect 在开发板执行 TestCase
《流畅的Python》可迭代的对象、迭代器和生成器
当我在自己的程序中发现用到了模式,我觉得这就表明某个地方出错了。程序的形式应该仅仅反映它所要解决的问题。代码中其他任何外加的形式都是一个信号,(至少对我来说)表明我对问题的抽象还不够深——这通常意味着自己正在手动完成事情,本应该通过写代码来让宏的扩展自动实现。
——Paul Graham, Lisp 黑客和风险投资人
迭代是数据处理的基石。扫描内存中放不下的数据集时,我们需要一种惰性获取数据项的方式,即按需一次获取一个数据项。这就是迭代器模式(Iterator pattern)。
本章说明 Python 是如何内置迭代器模式。
yield
关键字用于构建生成器,其作用于迭代器一样
所有的生成器都是迭代器。它们都实现了迭代器接口,区别于迭代器用于从集合中取出元素,生成器用来生成元素。
在 Python 中,所有集合都可以迭代,迭代器用于支持
- for 循环
- 构建和拓展集合类型
- 逐行遍历文本文件
- 列表推导、字典推导和集合推导
- 元祖拆包
- 调用函数时, * 拆包实参
本章覆盖话题:
- 使用
iter(...)
内置参数处理可迭代对象的方式 - 如何使用 Python 实现迭代器模式
- 生成器函数的工作原理
- 使用生成器 函数/表达式 代替迭代器
- 使用标准库中的通用生成器函数
- 使用
yield from
语句合并生成器 - 案例: 数据库转换工具中使用生成器函数处理大型数据集
- 生成器和协程的差异
Python 中的方法解析顺序(MRO)
用 Expect 处理命令行程序交互
《流畅的Python》接口之从协议到抽象基类
抽象类表示接口。
——Bjarne Stroustrup, C++ 之父
本章讨论的话题是接口:
从鸭子类型的代表特征动态协议,到使接口更明确、能验证实现是否符合规定的抽象基类(Abstract Base Class, ABC)。
接口的定义:对象公开方法的子集,让对象在系统中扮演特定的角色。
协议是接口,但不是正式的(只由文档和约定定义),因此协议不能像正式接口那样施加限制。
允许一个类上只实现部分接口。
接口与协议
-
什么是接口
对象公开方法的子集,让对象在系统中扮演特定的角色。
-
鸭子类型与动态协议
-
受保护的类型与私有类型不能在接口中
-
可以把公开的数据属性放在接口中