itertools标准化了一个快速、高效利用内存的核心工具集,这些工具本身或组合都很有用。它们一起形成了“迭代器代数”,这使得在纯Python中有可能创建简洁又高效的专用工具。
“无限”迭代器
count()会创建一个无限的迭代器,所以上述代码会打印出自然数序列,根本停不下来,只能按Ctrl+C退出1
2
3
4>>> import itertools
>>> natuals = itertools.count(1)
>>> for n in natuals:
... print(n)
cycle()会把传入的一个序列无限重复下去1
2
3
4>>> import itertools
>>> cs = itertools.cycle('ABC') # 注意字符串也是序列的一种
>>> for c in cs:
... print(c)
repeat()负责把一个元素无限重复下去,不过如果提供第二个参数就可以限定重复次数:1
2
3
4>>> ns = itertools.repeat('A', 3)
>>> for n in ns:
... print(n)
...
根据最短输入序列长度停止的迭代器
accumulate()创建一个迭代器,返回累积汇总值或其他双目运算函数的累积结果值1
2
3
4
5
6
7
8>>> ns = itertools.accumulate((1,2,3,4))
>>> for n in ns:
... print(n)
...
1
3
6
10
chain()可以把一组迭代对象串联起来,形成一个更大的迭代器1
2
3>>> for c in itertools.chain('ABC', 'XYZ'):
... print(c)
# 迭代效果:'A' 'B' 'C' 'X' 'Y' 'Z'
groupby()把迭代器中相邻的重复元素挑出来放在一起:1
2
3
4
5
6
7>>> for key, group in itertools.groupby('AAABBBCCAAA'):
... print(key, list(group))
...
A ['A', 'A', 'A']
B ['B', 'B', 'B']
C ['C', 'C']
A ['A', 'A', 'A']
chain.from_iterable 构建类似 chain() 迭代器的另一个选择。1
2
3
4
5
6
7
8
9
10>>> abc=itertools.chain.from_iterable(["abc","cde"])
>>> for a in abc:
... print(a)
...
a
b
c
c
d
e