python itertools模块指南

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

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
  • 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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值