itertools——创建高效迭代器的Python模块。
0x01:分类
itertools模块可创建的迭代器一般分为三类:
无限迭代器 (Infinite Iterators)
终止于最短输入序列的迭代器 (Iterators terminating on the shortest input sequence)
组合生成器 (Combinatoric generators)
- 1
- 2
- 3
0x02:无限迭代器
[1] count
itertools.count(start, step)
起始参数(start)默认值为0
步长(step)默认值为1
作用: 返回以start开头的均匀间隔step步长的值
import itertools
for item in itertools.count(10,3):
if item>100:
break
print item
- 1
- 2
- 3
- 4
- 5
- 6
结果:
会在终端打印出10,13,16,19,……,100
如果没有出口条件,理论上会从10开始,以3为步长,一直打印下去。
[2] cycle
itertools.cycle(iterable)
iterable 为可迭代对象
作用:保存迭代对象的每个元素的副本,无限的重复返回每个元素的副本
import itertools
its=["a","b","c","d"]
for item in itertools.cycle(its):
print item
- 1
- 2
- 3
- 4
- 5
结果:
会在终端不停的打印出a,b,c,d,a,b,c,d,a,……
[3] repeat
itertools.repeat(object[, times])
object为可迭代对象
times为迭代次数,默认为无限次
作用:按照指定的迭代次数重复返回每次的迭代对象
import itertools
its=["a","b","c"]
for item in itertools.repeat(its,4):
print item
- 1
- 2
- 3
- 4
- 5
- 6
结果:
['a', 'b', 'c']
['a', 'b', 'c']
['a', 'b', 'c']
['a', 'b', 'c']
- 1
- 2
- 3
- 4
0x03:终止于最短输入序列的迭代器
这部分包括如下函数,只对部分函数进行说明。
chain()
compress()
dropwhile()
groupby()
ifilter()
ifilterfalse()
islice()
imap()
starmap()
tee()
takewhile()
izip()
izip_longest()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
[1] chain
itertools.chain(*iterables)
*iterables为一个或多个可迭代序列
作用:返回所有可迭代序列
import itertools
its=["a","b","c","d"]
hers=["A","B","C","D"]
others=["1","2","3","4"]
for item in itertools.chain(its,hers,others):
print item
- 1
- 2
- 3
- 4
- 5
- 6
- 7
结果:
a
b
c
d
A
B
C
D
1
2
3
4
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
[2] compress
itertools.compress(data, selectors)
data为数据对象
selectors为选择器(规则)
作用:返回数据对象中对应规则为True的元素
import itertools
its=["a","b","c","d","e","f","g","h"]
selector=[True,False,1,0,3,False,-2,"y"]
for item in itertools.compress(its,selector):
print item
- 1
- 2
- 3
- 4
- 5
- 6
结果:
a
c
e
g
h
- 1
- 2
- 3
- 4
- 5
ifilter和ifilterfalse与其有些相似
返回谓词结果为True(ifilter)\False(ifilterfalse)的迭代器元素
itertools.ifilter(predicate, iterable)
takewhile又和ifilter十分相像:
itertools.takewhile(predicate, iterable)
import itertools
for item in itertools.ifilter(lambda x:x/3,range(6)):
print item
print "\n"
for item in itertools.ifilterfalse(lambda x:x-3,range(6)):
print item
- 1
- 2
- 3
- 4
- 5
- 6
- 7
结果:
3
4
5
3
- 1
- 2
- 3
- 4
- 5
[3] imap
itertools.imap(function, *iterables)
function为功能函数
*iterables为可迭代序列
作用:返回迭代序列中每个元素被功能函数执行后的值
import itertools
digi=[1,2,0]
for item in itertools.imap(lambda x:x+3,digi):
print item
- 1
- 2
- 3
- 4
- 5
结果:
4
5
3
- 1
- 2
- 3
[4] izip
itertools.izip(*iterables)
*iterables为一个或多个可迭代对象
作用:返回所有可迭代对象的迭代器(止于最短序列)
import itertools
digi=[1,2,0]
hers=["A","B","C","D"]
for item in itertools.izip(hers,digi):
print item
print "\n"
for item in itertools.izip(digi,hers):
print item
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
结果:
('A', 1)
('B', 2)
('C', 0)
(1, 'A')
(2, 'B')
(0, 'C')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
izip_longest则与izip有点相反的味道(止于最长序列)
itertools.izip_longest(*iterables[, fillvalue])
import itertools
digi=[1,2,0]
hers=["A","B","C","D"]
for item in itertools.izip_longest(hers,digi):
print item
- 1
- 2
- 3
- 4
- 5
- 6
结果:
('A', 1)
('B', 2)
('C', 0)
('D', None)
- 1
- 2
- 3
- 4
0x04:组合生成器
这一部分包括如下部分
[1] product
itertools.product(*iterables[, repeat])
*iterables为迭代器(对象)
repeat为迭代次数,默认为1
作用:对迭代对象中元素进行笛卡尔积运算
import itertools
digi=[1,2]
hers=["A"]
for item in itertools.product(digi,repeat=2):
print item
print "\n"
for item in itertools.product(digi,hers):
print item
print "\n"
for item in itertools.product(digi,hers,repeat=2):
print item
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
结果:
(1, 1)
(1, 2)
(2, 1)
(2, 2)
(1, 'A')
(2, 'A')
(1, 'A', 1, 'A')
(1, 'A', 2, 'A')
(2, 'A', 1, 'A')
(2, 'A', 2, 'A')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
[2] permutations
itertools.permutations(iterable[, r])
iterable是迭代器(对象)
r是迭代长度,默认为可获得的最大长度迭代
作用:返回连续长度为r的的迭代器(对象)
import itertools
digi=[1,2,3]
for item in itertools.permutations(digi,2):
print item
for item in itertools.permutations(range(3)):
print item
- 1
- 2
- 3
- 4
- 5
- 6
- 7
结果:
(1, 2)
(1, 3)
(2, 1)
(2, 3)
(3, 1)
(3, 2)
(0, 1, 2)
(0, 2, 1)
(1, 0, 2)
(1, 2, 0)
(2, 0, 1)
(2, 1, 0)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
combinations和combinations_with_replacement都与上面已经说明过得有点相似,不再单独阐述:
itertools.combinations(iterable, r)
import itertools
digi=[1,2,3]
for item in itertools.combinations(digi,2):
print item
print "\n"
for item in itertools.combinations(range(3),2):
print item
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
结果:
(1, 2)
(1, 3)
(2, 3)
(0, 1)
(0, 2)
(1, 2)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
itertools.combinations_with_replacement(iterable, r)
import itertools
digi=[1,2,3]
for item in itertools.combinations_with_replacement(digi,2):
print item
- 1
- 2
- 3
- 4
- 5
结果:
(1, 1)
(1, 2)
(1, 3)
(2, 2)
(2, 3)
(3, 3)
- 1
- 2
- 3
- 4
- 5
- 6
0x05:后记
有了以上itertools的了解,应该可以处理一些简单的迭代功能的应用了,涉及到具体功能的实现(如爆破字典生成),就只能再结合其他的一些知识,具体问题具体分析了。