《Python Cookbook(第3版)中文版》读书笔记,持续更新中…
本书基于 Python3.3
资源
本书开源翻译地址:python3-cookbook
对照着这个翻译看就够了,不需要费劲去扒英文原书地址和勘误表。
目录
第 1 章 数据结构和算法
1.1 将序列分解为单独的变量
- P2
实际上不仅仅只是元组或列表,只要对象恰好是可迭代的,那么就可以执行分解操作。
这包括字符串、文件、迭代器以及生成器。
1.2 从任意长度的可迭代对象中分解元素
Python 的“*表达式”不仅可以用在函数的可变参数,还可以分解任意长度的可迭代对象中的元素。
这个可玩的花样太多,真的有点奇技淫巧了。
1.3 保存最后 N 个元素
这条讲 Python 中队列用 collections.deque 实现。
1.4 找到最大或最小的 N 个元素
topk 问题,用大顶堆或小顶堆实现。Python 中可以用 heapq 模块中的 nlargest() 和 nsmallest() 函数。
1.5 实现优先级队列
本条也还是用 heapq 实现,不过提到了比较两个元组的大小的方式。
1.6 在字典中将键映射到多个值上
本条讲 collections.defaultdict 的使用,可以参考:collections
1.7 让字典保持有序
本条讲 collections.OrderedDict 可以实现控制字典字段顺序。
但由于其内部维护了一个双向链表,所以大小是普通 dict 的 2 倍多,在数据量大时需注意。
1.8 与字典有关的计算问题
本条讲 zip() 函数对 dict 的元素转为“值-键”元素列表形式,以便计算最大最小值等。
1.9 在两个字典中寻找相同点
字典可以通过 &、- 等操作符求交集和差集等。
1.10 从序列中移除重复项且保持元素间顺序不变
准备一个空集合,遍历序列,遍历过程中判断元素是否在集合中,若在则跳过,否则 yield 这个元素并添加到集合中。
如果元素是可变的,那就再提供一个该元素类型的 hash 函数,再按相同方法去重。
1.11 对切片命名
对切片命名比直接使用下标硬编码可读性高
1.12 找出序列中出现次数最多的元素
本条讲可以用 collections.Counter 类来实现计数相关操作
1.13 通过公共键对字典列表排序
用 operator 模块中的 itemgetter 函数实现根据字典的某(几)个属性对字典列表排序,比用 lambda 表达式快些。
1.14 对不原生支持比较操作的对象排序
这一条跟上一条类似,不过这条是针对对象列表的排序,使用 operator 模块中的 attrgetter() 要比 lambda 表达式快些。
1.15 根据字段将记录分组
itertools.groupby() 函数可以将按某个属性排好序的字典或对象进行分组,且为迭代器,比用字典省内存。
1.16 筛选序列中的元素
简单的筛选条件用列表推导或生成器表达式。
包含复杂筛选条件的可以将筛选逻辑写成函数然后使用内建的 filter() 函数。
itertools.compress() 可以将筛选条件列表分别应用于一个序列。
1.17 从字典中提取子集
本条讲使用字典推导实现对字典的筛选。
1.18 将名称映射到序列的元素中
这条讲 collections.namedtuple() (命名元组)的妙用,讲的很好很详细。
命名元组支持所有普通元组所支持的操作,例如索引(indexing)和分解(unpacking)。
命名元组的主要作用在于将代码同它所控制的元素位置间解耦。
命名元组是不可变的,这一点和类是个很大的区别。
命名元组的 _replace() 方法会创建一个全新的命名元组,并对相应的值做替换。
个人总结,对于不可变的对象,用命名元组比用类更合适。
另外可以参考廖雪峰教程:collections
1.19 同时对数据做转换和换算
sum()、min()、max() 等函数可以接受一个生成器表达式,例如:
1 | nums = [1, 2, 3, 4, 5] |
1.20 将多个映射合并为单个映射
可以用 ChainMap 和字典的 update() 方法。前者使用的是原始字典,后者是修改现有的一个字典。