- 前言
- 目标读者
- 非目标读者
- 本书的结构
- 以实践为基础
- 硬件
- 杂谈:个人的一点看法
- Python 术语表
- Python 版本表
- 排版约定
- 使用代码示例
- 第一部分 序幕
- 第 1 章 Python 数据模型
- 第二部分 数据结构
- 第 2 章 序列构成的数组
- 第 3 章 字典和集合
- 第 4 章 文本和字节序列
- 第三部分 把函数视作对象
- 第 5 章 一等函数
- 第 6 章 使用一等函数实现设计模式
- 第 7 章 函数装饰器和闭包
- 第四部分 面向对象惯用法
- 第 8 章 对象引用、可变性和垃圾回收
- 第 9 章 符合 Python 风格的对象
- 第 10 章 序列的修改、散列和切片
- 第 11 章 接口:从协议到抽象基类
- 第 12 章 继承的优缺点
- 第 13 章 正确重载运算符
- 第五部分 控制流程
- 第 14 章 可迭代的对象、迭代器和生成器
- 14.1 Sentence 类第1版:单词序列
- 14.2 可迭代的对象与迭代器的对比
- 14.3 Sentence 类第2版:典型的迭代器
- 14.4 Sentence 类第3版:生成器函数
- 14.5 Sentence 类第4版:惰性实现
- 14.6 Sentence 类第5版:生成器表达式
- 14.7 何时使用生成器表达式
- 14.8 另一个示例:等差数列生成器
- 14.9 标准库中的生成器函数
- 14.10 Python 3.3 中新出现的句法:yield from
- 14.11 可迭代的归约函数
- 14.12 深入分析 iter 函数
- 14.13 案例分析:在数据库转换工具中使用生成器
- 14.14 把生成器当成协程
- 14.15 本章小结
- 14.16 延伸阅读
- 第 15 章 上下文管理器和 else 块
- 第 16 章 协程
- 第 17 章 使用期物处理并发
- 第 18 章 使用 asyncio 包处理并发
- 第六部分 元编程
- 第 19 章 动态属性和特性
- 第 20 章 属性描述符
- 第 21 章 类元编程
- 结语
- 延伸阅读
- 附录 A 辅助脚本
- Python 术语表
- 作者简介
- 关于封面
2.10 本章小结
要想写出准确、高效和地道的 Python 代码,对标准库里的序列类型的掌握是不可或缺的。
Python 序列类型最常见的分类就是可变和不可变序列。但另外一种分类方式也很有用,那就是把它们分为扁平序列和容器序列。前者的体积更小、速度更快而且用起来更简单,但是它只能保存一些原子性的数据,比如数字、字符和字节。容器序列则比较灵活,但是当容器序列遇到可变对象时,用户就需要格外小心了,因为这种组合时常会搞出一些“意外”,特别是带嵌套的数据结构出现时,用户要多费一些心思来保证代码的正确。
列表推导和生成器表达式则提供了灵活构建和初始化序列的方式,这两个工具都异常强大。如果你还不能熟练地使用它们,可以专门花时间练习一下。它们其实不难,而且用起来让人上瘾。
元组在 Python 里扮演了两个角色,它既可以用作无名称的字段的记录,又可以看作不可变的列表。当元组被当作记录来用的时候,拆包是最安全可靠地从元组里提取不同字段信息的方式。新引入的 * 句法让元组拆包的便利性更上一层楼,让用户可以选择性忽略不需要的字段。具名元组也已经不是一个新概念了,但它似乎没有受到应有的重视。就像普通元组一样,具名元组的实例也很节省空间,但它同时提供了方便地通过名字来获取元组各个字段信息的方式,另外还有个实用的 ._asdict() 方法来把记录变成 OrderedDict 类型。
Python 里最受欢迎的一个语言特性就是序列切片,而且很多人其实还没完全了解它的强大之处。比如,用户自定义的序列类型也可以选择支持 NumPy 中的多维切片和省略(...)。另外,对切片赋值是一个修改可变序列的捷径。
重复拼接 seq * n 在正确使用的前提下,能让我们方便地初始化含有不可变元素的多维列表。增量赋值 += 和 *= 会区别对待可变和不可变序列。在遇到不可变序列时,这两个操作会在背后生成新的序列。但如果被赋值的对象是可变的,那么这个序列会就地修改——然而这也取决于序列本身对特殊方法的实现。
序列的 sort 方法和内置的 sorted 函数虽然很灵活,但是用起来都不难。这两个方法都比较灵活,是因为它们都接受一个函数作为可选参数来指定排序算法如何比较大小,这个参数就是 key 参数。key 还可以被用在 min 和 max 函数里。如果在插入新元素的同时还想保持有序序列的顺序,那么需要用到 bisect.insort。bisect.bisect 的作用则是快速查找。
除了列表和元组,Python 标准库里还有 array.array。另外,虽然 NumPy 和 SciPy 都不是 Python 标准库的一部分,但稍微学习一下它们,会让你在处理大规模数值型数据时如有神助。
本章末尾介绍了 collections.deque 这个类型,它具有灵活多用和线程安全的特性。表 2-3 将它和列表的 API 做了比较。本章最后也提及了一些标准库中的其他队列类型的实现。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论