Fluent-Python-读书笔记(二):可迭代对象的一般用法
0x00 好久不见
转眼间已经放假了。真的是好久没写了,书也是好久没看。这学期除了在忙活让我五味杂陈的“人脸识别”的项目,还有最后坑爹的压力表设计。但是好歹结果不错,都让我学到了很多。
以上是题外话,今天要说的可迭代对象 (iterable) 的一般用法。以往我们(也就是我啦)经常滥用 list
对象,在我的程序里几乎不是 list
就是 dict
。因为它们实在是太好用了,也是它们让我觉得写 python 非常爽。那么它们到底应该怎么用呐?
0x01 怎么爽了
当然是强大的列表表达式 (listcomps) 啦:
|
|
用 listcomps 可以基本取代 map 函数,而且比它更方便、易读。如果把最外层的 []
换成 ()
就变成了生成器对象,这在要用计算好的对象做迭代的时候可以节约资源。
另外自然还有 dictcomps ,用来生成字典:
|
|
以上操作可以方便的把 dict
键值对交换。
0x02 一般准则
既然不能什么事都交给 list
干,那么应该遵循怎样的规则呢?下面给出了几种常用的对象:
- list
- array
- tuple
- deque
- named tuple
这里面 array 是个比较特殊的对象,它是一个只能包含单一数据类型的序列 (flat sequence),其余的都可以包含各种各样的数据类型。另外,tuple 和 namedtuple 都是不可变对象,意味着它们一旦被赋值,是不允许改变的。
Array
|
|
Array 主要用于储存大量的同类型数据,在这方面它比 list
要更快、更节约资源。不过我们一般用 numpy.array 。矩阵运算必不可少的工具。
Tuple & named Tuple
Tuples Are Not Just Immutable Lists
——书第26页
tuple
不仅仅是不可变的 list
。事实上,我们经常用 tuple
做记录 (record) 。
|
|
像这样的列表的元组 (list of tuples) 是十分常用的一种结构,它不仅仅储存记录,还可以十分方便的转换为 dict
对象。
namedtuple
是 tuple
的加强版:
|
|
[1]: Two parameters are required to create a named tuple: a class name and a list of field names, which can be given as an iterable of strings or as a single spacedelimited string.
Deque
deque
(double-ended queue) 是一种双向队列,我用得比较少。
The class collections.deque is a thread-safe double-ended queue designed for fast inserting and removing from both ends.
|
|
0x03 维护一个有序序列
The bisect module offers two main functions—bisect and insort—that use the binary search algorithm to quickly find and insert items in any sorted sequence.
一旦我们有一个有序的序列,最好不要破坏它的有序性。 bisect
使用二分法来维护一个有序序列。
下面有一个通过这种方式来给成绩分级的巧妙例子:
|
|
值得注意的是:grade
函数定义中的 breakpoints=[60, 70, 80, 90]
不是很稳妥,尽量不要用可变对象作为函数的默认参数。
其实 bisect
还有很多值得关注的函数和用法,具体可以参阅官方文档。