这篇文章参考的是Python3官方文档,应该说是翻译文档。
https://docspy3zh.readthedocs.io/en/latest/library/itertools.html#itertools.cycle
itertools模块实现了一些迭代器的构建块,它标准化了一组快速、内存高效的工具。
itertools模块中有三种迭代器生产工具:无限迭代器、处理短输入文本的迭代器、组合迭代器。
无限迭代器:
迭代器 | 参数 | 结果 | 例子 |
---|---|---|---|
count() | start,[step] | start, start+step, start+2*step, … | count(10) --> 10 11 12 13 14 … |
cycle() | p | p0, p1, … plast, 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 | p0, p0+p1, p0+p1+p2, … | 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 | seq[n], seq[n+1], 当pred为false时开始返回 | dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1 |
filterfalse() | pred, seq | 返回满足pred(elem)为false的元素 | filterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8 |
groupby() | iterable[, keyfunc] | sub-iterators grouped by value of keyfunc(v) | |
islice() | seq, [start,] stop [, step] | elements from seq[start:stop:step] | islice(‘ABCDEFG’, 2, None) --> C D E F G |
starmap() | func, seq | func(*seq[0]), func(*seq[1]), … | starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000 |
takewhile() | pred, seq | seq[0], seq[1], until pred fails | takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4 |
tee() | it, n | it1, it2 , … itn splits one iterator into n | |
zip_longest() | p, q, … | (p[0], q[0]), (p[1], q[1]), … | zip_longest(‘ABCD’, ‘xy’, fillvalue=’-’) --> Ax By C- D- |
组合迭代器
迭代器 | 参数 | 结果 |
---|---|---|
product() | p, q, … [repeat=1] | 笛卡尔积,相当于嵌套了for循环 |
permutations() | p[, r] | 长度为r的元组所有的排序,没有重复 |
combinations() | p, r | 长度为r的元组,按顺序排序,无重复 |
combinations_with_replacement() | p, r | 长度为r的元组,按顺序排序,有重复 |
给出上述四个函数的使用例子:
product('ABCD', repeat=2) -->AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD
permutations('ABCD', 2) -->AB AC AD BA BC BD CA CB CD DA DB DC
combinations('ABCD', 2) -->AB AC AD BC BD CD
combinations_with_replacement('ABCD', 2) -->AA AB AC AD BB BC BD CC CD DD
函数介绍
函数的使用方法上述表格给出的例子简洁明了的说明了,下面选择性的对几个函数进一步解释。
itertools.accumulate(iterable)
构建一个返回累积和的迭代器。元素可以是任意可加的小数或分数。它就相当于:
def accumulate(iterable):
'Return running totals'
#accumulate([1,2,3,4,5])-->1 3 6 10 15
it=iter(iterable)
total=next(it)
yield total
for element in it:
total=total+element
yield total
itertools.chain(*iterables)
构建一个迭代器,它返回第一个可迭代对象的元素直至完全,然后继续下一个可迭代对象。将多个序列当作单个序列处理。相当于:
def chain(*iterables):
#chain('ABC','DEF')-->A B C D E F
for it in iterables:
for element in it:
yield element
itertools.combinations(iterable, r)
从输入的可迭代对象的元素中返回r长度的子序列。组合按字典的顺序给出,若输入的可迭代对象是排序的,则组合的元组也是排序的。元素被视为独特的是因为它们的位置,而不是值。因此,如果输入元素是唯一的,则每个组合中不会有重复值。
itertools.count(start=0, step=1)
创建一个迭代器,该迭代器返回以n开头的等间隔值。通常用作map()的参数,以生成连续的数据点。另外,与zip()一起使用来添加序列号。相当于:
def count(start=0,step=1):
#count(10) -->10 11 12 13 14...
#count(2.5,0.5) -->2.5 3.0 3.5...
n=start
while True:
yield n
n+=step
itertools.cycle(iterable)
构建一个迭代器,该迭代器返回可迭代对象的元素并且保存副本,当可迭代对象迭代完后,从保存的副本中返回元素。无限期重复。
itertools.islice(iterable, [start, ]stop[, step])
生成一个迭代器,它从可迭代对象中返回选定元素。start为开始迭代的位置,step为步长,stop为迭代结束的位置。若stop为None,则迭代继续直至迭代器耗尽。和常规切片不同的是,这三个参数都不支持负数。
itertools.dropwhile(predicate, iterable)
构建一个迭代器,只要断言为真,则删除元素;之后返回每个元素。注意,该迭代器不产生任意输出直到断言为false。