转自官方文档:https://docs.python.org/zh-cn/3/library/itertools.html
itertools 模块实现一系列 iterator ,这些迭代器受到APL,Haskell和SML的启发。为了适用于Python,它们都被重新写过。
本模块标准化了一个快速、高效利用内存的核心工具集,这些工具本身或组合都很有用。它们一起形成了“迭代器代数”,这使得在纯Python中有可能创建简洁又高效的专用工具。
例如,SML有一个制表工具: tabulate(f),它可产生一个序列 f(0), f(1), …。在Python中可以组合map()
和count()
实现: map(f, count())
。
这些内置工具同时也能很好地与 operator 模块中的高效函数配合使用。例如,我们可以将两个向量的点积映射到乘法运算符: sum(map(operator.mul, vector1, vector2))
。
迭代器 |
实参 |
结果 |
示例 |
---|---|---|---|
|
start, [step] |
start, start+step, start+2*step, ... |
|
|
Iterable p |
p0, p1, ... plast, p0, p1, ... |
|
|
elem [,n] |
elem, elem, elem, ... 重复无限次或n次 |
|
for i in count(3, 2):
print(i)
3
5
7
9
...
for i in cycle('ABCD'):
print(i)
A
B
C
D
A
B
...
for i in repeat(10, 3):
print(i)
10
10
10
迭代器 |
实参 |
结果 |
示例 |
---|---|---|---|
|
p [,func] |
p0, p0+p1, p0+p1+p2, ... |
|
|
p, q, ... |
p0, p1, ... plast, q0, q1, ... |
|
|
iterable |
p0, p1, ... plast, q0, q1, ... |
|
|
data, selectors |
(d[0] if s[0]), (d[1] if s[1]), ... |
|
|
pred, seq |
seq[n], seq[n+1], ... 从pred首次真值测试失败开始 |
|
|
pred, seq |
seq中pred(x)为假值的元素,x是seq中的元素。 |
|
|
iterable[, key] |
根据key(v)值分组的迭代器 |
|
|
seq, [start,] stop [, step] |
seq[start:stop:step]中的元素 |
|
|
func, seq |
func(*seq[0]), func(*seq[1]), ... |
|
|
pred, seq |
seq[0], seq[1], ..., 直到pred真值测试失败 |
|
|
it, n |
it1, it2, ... itn 将一个迭代器拆分为n个迭代器 |
|
|
p, q, ... |
(p[0], q[0]), (p[1], q[1]), ... |
|
for i in accumulate([1, 2, 3, 4, 5]):
print(i)
1
3
6
10
15
for i in starmap(lambda a, b, c: a * b * c, [(1, 2, 3), (4, 5, 6), (10, 3, 2)]):
print(i)
6
120
60
迭代器 |
实参 |
结果 |
---|---|---|
|
p, q, ... [repeat=1] |
笛卡尔积,相当于嵌套的for循环 |
|
p[, r] |
长度r元组,所有可能的排列,无重复元素 |
|
p, r |
长度r元组,有序,无重复元素 |
|
p, r |
长度r元组,有序,元素可重复 |
例子 |
结果 |
---|---|
|
|
|
|
|
|
|
|
from itertools import *
for i in product('ABC', repeat=2):
print("".join(list(i)))
for i in permutations('ABC', 2):
print("".join(list(i)))
for i in combinations('ABC', 2):
print("".join(list(i)))
---------- 3^2 = 9 ------------
AA
AB
AC
BA
BB
BC
CA
CB
CC
---------- A32 = 6 ------------
AB
AC
BA
BC
CA
CB
---------- C32 = 3 ------------
AB
AC
BC
下列模块函数均创建并返回迭代器。有些迭代器不限制输出流长度,所以它们只应在能截断输出流的函数或循环中使用。
itertools.accumulate(iterable[, func, *, initial=None])
创建一个迭代器,返回累积汇总值或其他双目运算函数的累积结果值(通过可选的 func 参数指定)。
如果提供了 func,它应当为带有两个参数的函数。 输入 iterable 的元素可以是能被 func 接受为参数的任意类型。 (例如,对于默认的加法运算,元素可以是任何可相加的类型包括 Decimal 或 Fraction。)
通常,输出的元素数量与输入的可迭代对象是一致的。 但是,如果提供了关键字参数 initial,则累加会以 initial 值开始,这样输出就比输入的可迭代对象多一个元素。
大致相当于:
def accumulate(iterable, func=operator.add, *, initial=None):
'Return running totals'
# accumulate([1,2,3,4,5]) --> 1 3 6 10 15
# accumulate([1,2,3,4,5], initial=100) --> 100 101 103 106 110 115
# accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120
it = iter(iterable)
total = initial
if initial is None:
try:
total = next(it)
except StopIteration:
return
yield total
for element in it:
total = func(total, element)
yield total
func 参数有几种用法。它可以被设为 min() 最终得到一个最小值,或者设为 max() 最终得到一个最大值,或设为 operator.mul() 最终得到一个乘积。摊销表可通过累加利息和支付款项得到。给iterable设置初始值并只将参数 func 设为累加总数可以对一阶 递归关系 建模。