##### itertools 库
- 本模块实现一系列迭代器
```python
import itertools
```
##### itertools 主要API
```python
# 无穷迭代器:
itertools.count( start [,step] )
# count(10) --> 10 11 12 13 14 ...
itertools.cycle(p)
# cycle('ABCD') --> A B C D A B C D ...
itertools.repeat(elem [,n] )
# repeat(10, 3) --> 10 10 10
# 根据最短输入序列长度停止的迭代器:
itertools.accumulate( p [, func, *, initial=None ] )
# accumulate([1,2,3,4,5]) --> 1 3 6 10 15
# func为双目运算函数,initial为起始值
itertools.chain(p, q, ...)
# chain('ABC', 'DEF') --> A B C D E F
itertools.compress(data, selectors)
# compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F
itertools.dropwhile(predicate, iterable)
# dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1
# 去掉第一个 False 之前的元素,保留后面所有元素
itertools.filterfalse(predicate, iterable)
# filterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8
# 只返回 iterable 中 predicate 为 False 的元素
itertools.groupby(iterable, key=None)
# 先按 key 排序 sorted,再按 key 结果值分组
itertools.pairwise(iterable)
# pairwise('ABCDEFG') --> AB BC CD DE EF FG
itertools.starmap(function, iterable)
# starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000
itertools.takewhile(predicate, iterable)
# takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4
# 返回真值,遇到第一个错误停止
itertools.zip_longest(*iterables, fillvalue=None)
# zip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-
# 创建一个迭代器,从每个可迭代对象中收集元素。
# 长度未对齐,将根据 fillvalue 填充缺失值。
# 排列组合迭代器:
product(*iterables, repeat=1)
# product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
# product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
# 元组表示组合,存在列表中
# 笛卡尔积
permutations(iterable, r=None)
# permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC
# 排列
combinations(iterable, r)
# combinations('ABCD', 2) --> AB AC AD BC BD CD
# 组合
combinations_with_replacement(iterable, r)
# combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC
# 允许重复的组合
```