您的位置:首页 > 编程语言 > Python开发

python itertools模块指南

2016-06-07 15:36 393 查看

0x00:简介

itertools——创建高效迭代器的Python模块。

0x01:分类

itertools模块可创建的迭代器一般分为三类:

无限迭代器                 (Infinite Iterators)
终止于最短输入序列的迭代器   (Iterators terminating on the shortest input sequence)
组合生成器                 (Combinatoric generators)


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


结果:

会在终端打印出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


结果:

会在终端不停的打印出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


结果:

['a', 'b', 'c']
['a', 'b', 'c']
['a', 'b', 'c']
['a', 'b', 'c']


0x03:终止于最短输入序列的迭代器

这部分包括如下函数,只对部分函数进行说明。

chain()
compress()
dropwhile()
groupby()
ifilter()
ifilterfalse()
islice()
imap()
starmap()
tee()
takewhile()
izip()
izip_longest()


[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


结果:

a
b
c
d
A
B
C
D
1
2
3
4


[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


结果:

a
c
e
g
h


ifilterifilterfalse与其有些相似

返回谓词结果为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


结果:

3
4
5

3


[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


结果:

4
5
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


结果:

('A', 1)
('B', 2)
('C', 0)

(1, 'A')
(2, 'B')
(0, 'C')


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


结果:

('A', 1)
('B', 2)
('C', 0)
('D', None)


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, 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')


[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)
(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)


combinationscombinations_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)
(1, 3)
(2, 3)

(0, 1)
(0, 2)
(1, 2)


itertools.combinations_with_replacement(iterable, r)

import itertools

digi=[1,2,3]
for item in itertools.combinations_with_replacement(digi,2):
print item


结果:

(1, 1)
(1, 2)
(1, 3)
(2, 2)
(2, 3)
(3, 3)


0x05:后记

有了以上itertools的了解,应该可以处理一些简单的迭代功能的应用了,涉及到具体功能的实现(如爆破字典生成),就只能再结合其他的一些知识,具体问题具体分析了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python itertools 迭代器