Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数。
itertools.count(start=0, step=1)
创建一个迭代器,生成从n开始的连续整数,如果忽略n,则从0开始计算(注意:此迭代器不支持长整数)
如果超出了sys.maxint,计数器将溢出并继续从-sys.maxint-1开始计算。
当使用浮点数进行计数时,有时可以通过替换乘法代码来实现更高的准确率,例如:(start + step * i for i in count())
该方法等价于:
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)
创造一个迭代器,复制从当前迭代器返回的每一个元素并将其保存到创建的迭代器中。当当前迭代器耗尽时,从创造的迭代器循环返回元素。
简单理解就是,传入一个序列,无限循环下去
大致相当于:
def cycle(iterable):
# cycle('ABCD') --> A B C D A B C D A B C D ...
saved = []
for element in iterable:
yield element
saved.append(element)
while saved:
for element in saved:
yield element
itertools.repeat(object[, times])
让迭代器一次又一次地返回对象。无限运行,除非指定了times
参数控制重复次数
大致相当于:
def repeat(object, times=None):
# repeat(10, 3) --> 10 10 10
if times is None:
while True:
yield object
else:
for i in range(times):
yield object
repeat的一个常见用法是提供一个用于map或zip的常数流:
>>> list(map(pow, range(10), repeat(2)))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
itertools.accumulate(iterable[, func])
创建一个迭代器,它返回计算的累积和,或其他二进制函数的计算结果(这个二进制函数可以通过func参数指定)。如果指定了func参数,必须保证这个参数对应的函数可以接收两个参数。
大致相当于:
def accumulate(iterable, func=operator.add):
'Return running totals'
# accumulate([1,2,3,4,5]) --> 1 3 6 10 15
# accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120
it = iter(iterable)
try:
total = next(it)
except StopIteration:
return
yield total
for element in it:
total = func(total, element)
yield total
如果很难理解,可以这样理解:
对于默认func来说,结果就是[p0, p0+p1, p0+p1+p2, …]
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
classmethod chain.from_iterable(iterable)
改变chain()
的结构,从一个懒加载的可迭代对象中获取输入值。大致相当于:
def from_iterable(iterables):
# chain.from_iterable(['ABC', 'DEF']) --> A B C D E F
for it in iterables:
for element in it: