python itertools模块指南

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的了解,应该可以处理一些简单的迭代功能的应用了,涉及到具体功能的实现(如爆破字典生成),就只能再结合其他的一些知识,具体问题具体分析了。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页