python cookbook 一书非常经典,作者David Beazley
,拥有超过20年的Python使用经验,再加上他很强的写作技能,所以值得一看。
它的翻译版本也有很多,其中比较优秀的版本是yidao620c翻译的,今天查阅翻译作者,就职华为。当然,最重要的还是书的内容好,这种按照一个小的话题展开讨论的方式,相信很多Python爱好者都比较喜欢。
这本书的话题要想理解透,还是需要具备一定的Python基础,不太适合纯Python小白。下面说说这本书,到底好在哪里,该怎么使用。
这是它的整体大纲目录,一共包括十五章,分别讨论:数据结构,字符串,数字,迭代器和生成器,文件与IO,函数、类、模块,网络编程,并发与测试。
这些都属于Python中最最核心的知识模块,原书作者David个人推荐解决现实问题时,优先考虑Python中内置的模块是否能解决问题。
那么这本书到底好在哪里呢?它分话题展开讨论,每个话题都足够精简,无废话。最大限度的从实际应用总结每个知识点,比如在话题:保留最后N个元素时,编写的代码就很漂亮:
from collections import deque
def search(lines, pattern, history=5):
previous_lines = deque(maxlen=history)
for line in lines:
if pattern in line:
yield line, previous_lines
previous_lines.append(line)
# Example use on a file
if __name__ == '__main__':
with open(r'../../cookbook/somefile.txt') as f:
for line, prevlines in search(f, 'python', 5):
for pline in prevlines:
print(pline, end='')
print(line, end='')
print('-' * 20)
保留有限历史记录正是 collections.deque
大显身手的时候,难得是作者会对上面的代码做了简要的分析:
我们在写查询元素的代码时,通常会使用包含
yield
表达式的生成器函数,也就是我们上面示例代码中的那样。这样可以将搜索过程代码和使用搜索结果代码解耦
让我们真正明白到底好在哪里,以及Python内置的模块真的很强大。
再比如作者在讨论查找最大或最小的 N 个元素
这个话题时,表面上这是一个很简单的话题,其实如果要考虑的全面,也是需要留意一些事情的。作者分别讨论了:
当查找元素个数
N = 1
时,建议直接使用max
或min
方法当查找元素个数接近整个列表长度时,建议使用
sorted
函数以切片的方式获取当要查找的元素个数相对比较小的时候,函数
nlargest()
和nsmallest()
是很合适的
相信大家都对前两种情况的解决方法比较熟悉,第三种使用内置模块heapq
是算法中的堆结构,常见的大根堆,小根堆,
>>> nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]
>>> import heapq
>>> heap = list(nums)
>>> heapq.heapify(heap)
>>> heap
[-4, 2, 1, 23, 7, 2, 18, 23, 42, 37, 8]
>>>
Python中heapify后,默认建立一个小根堆
。它最重要的特征是 heap[0]
永远是最小的元素。
比如,如果想要查找最小的 3 个元素,你可以这样做,首先执行一次heappop后,次小元素变为最小,如下图所示:
>>> heapq.heappop(heap)
-4
再次执行两次后,就能得到列表的前三个最小的元素为[-4,1,2]
,此时的小根堆为如下图所示:
>>> heapq.heappop(heap)
1
>>> heapq.heappop(heap)
2
当然,也可以直接使用nsmallest获取前几个最小值。
除此之外,这本书还有很多有趣且实用的Python知识,都值得我们仔细学习。这是第一张讨论的20个话题:
如果你对解压可迭代对象赋值给多个变量
还不是太了解,建议下载这本电子书抽空学习一下。这本书的电子版也是目前最好的yidao620c.
下载方式如下,关注Python小例子
并回复pycook
Python小例子,长按关注
阅读更多: