4.3.5 标准库中的生成器函数
itertools 模块提供了很多生成器函数,这些函数处理可迭代的对象,并且返回生成器(节省内存,可迭代)。想要了解生成器函数,唯一可能的知识来源就是这篇官方文档,本节会做简单的翻译和解释。它把生成器函数分为三大类。
第一类函数返回的是无限生成器:
函数名
参数
返回结果
示例
count()
start, [step]
start, start+step, start+2*step, …
count(10) --> 10 11 12 13 14 ...
copy()
p(数组)
p0, p1, ..., pn, p0, p1, ...
cycle('ABCD') --> A B C D A B C D ...
repeat()
elem [,n]
elem, elem, elem, … 无尽队列或最多 n 次
repeat(10, 3) --> 10 10 10
这三个函数的注释都说明得清楚了,配合示例应该非常容易理解。
第二类函数返回的是有限生成器,长度和传入的可迭代对象有关,我选择几个比较常用的列出来 :
函数名
参数
返回结果
示例
accumulate()
p [,func]
p0, func(p0, p1), func(p1, p2), func(p2, p3) ...
accumulate([1,2,3,4,5]) --> 1 3 6 10 15
chain()
p, q, …
p0, p1, … plast, q0, q1, …
chain('ABC', 'DEF') --> A B C D E F
compress()
data, selectors
(d[0] if s[0]), (d[1] if s[1]), …
compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F
dropwhile()
pred, seq
假设 pred 在第 n 个元素开始不成立:seq[n], seq[n+1]
dropwhile(lambda x: x 6 4 1
tee()
it, n
产出 n 各元素的数组,每个元素可以看做 it 的备份,相当于把 it 复制了 n 份
tee('ABC', 2) --> g1, g2(迭代 g1 和 g2 都会得到 A、B、C)
最后一类是可以实现排列组合操作的生成器函数:
函数名
参数
返回结果
product()
p, q, … [repeat=1]
生成各个可迭代对象的笛卡尔积,n 表示每个可迭代对象对象重复几次
permutations()
p[, r]
序列 p 所有长度为 r 的无重复元素排列
combinations_with_replacement()
p, [r]
序列 p 所有长度为 r 的有重复元素有序排列
combinations()
p, [r]
序列 p 所有长度为 r 的有重复元素有序排列
举例说明:
本节仅列出了一部分常用的生成器函数,他们是系统库提供的轮子。因此在自己实现关于序列的操作以前,应该思考下这是否是常见操作,系统是否已经提供了轮子。在官方文档的最后一节 还有一些基于上述生成器函数的拓展,通过简单的封装了 itertools 模块中的生成器函数,提供了更多常见的函数,比如 take、tail、consume、nth、flatten 等等,强烈建议阅读一遍并且形成基本印象!
Last updated