非常简单的介绍itertools,仅仅是为了自己能边历所有的python标准库的手法之一,以下是常用的
itertools中的函数。
import itertools
# 产生一个指定数组的搭配,如44,43,42总共有12种
# 对应的数学意义是排列
for i in itertools.permutations([4,4,3,2,],r=2):
print i
#%%
# 对应的数学意义是组合 'abc' ab,ac,bc
# 还有一个类似的combinations_with_replacement可以额外生成
# aa,bb,cc
for i in itertools.combinations(range(4),2):
print i
#%%
# 产生一个计数的generator,该计数器没有终点,有的话是根据另外一个的数组,
# 形成imap,izip要搭配另一个使用,否则停不下来.参数步长可以指定每次递增的步长
for i , z in itertools.izip(range(10),itertools.count(10,2)):
print i ,z
#%%
# 将多个数组拆开成但个元素,逐个输出
for i in itertools.chain(range(5),range(5,10)):
print i
#%%
# 生成n个相同的序列,但是一旦初始化,也就是其中任意一个
# 迭代器生成之后,序列就固定了,因为每一个迭代器会因此得到
# 相同的值
for i in itertools.tee(range(3),3):
for j in i:
print j
#%%
# imap的函数迭代器,跟map很像,只不过它需要的是
# 临时的计算,不会实现全部计算完
def func(f,num):
return f ** num
for i in itertools.imap(func,range(1,10),range(0,10)):
print i
#%%
# izip的打包迭代器,类似zip,只不过是generator实现而已
for a,b,c in itertools.izip(range(1,5),range(5,9),range(9,13)):
print a,b,c
#%%
# 无限循环的迭代器,可以把一个可迭代的对象无限迭代
cycle = itertools.cycle(range(5))
for i in range(14):
print next(cycle)
#%%
# 将一个序列按照制定的参数,进行分割一共有1个可选参数
# 两个参数的话,直接默认第二个参数为终点
# 多个参数,第一个为起点,第二个为终点,第三个为步长
for i in itertools.islice(range(8),3):
print i
for i in itertools.islice(range(8),1,None,2)
print i
for i in itertools.islice(range(8),1,4,2)
print i
#%%
# 重复生成同一个数字
for i , z in itertools.izip(range(5),itertools.repeat(10)):
print i , z
#%%
# groupby类似sql中的groupby,第一个参数返回group的建,
# 第二个返回组
for k , g in itertools.groupby([1,1,1,1,4,4,4,3,2,222,3,3,3,1,1]):
print k
#%%
# 过滤的迭代器ifilterfalse为相反
def mod(x):
if x % 2 ==0:
return True
else:
return False
for i in itertools.ifilter(mod,range(10)):
print i
#%%
# 返回序列的乘积
for i , z in itertools.product(range(3),repeat=2):
print i ,z
#%%
# 根据selectors选择杜英的元素,返回一个tuple
for i in itertools.compress(range(10),itertools.cycle([0,1])):
print i
#%%
# 遇到第一个达到不满足条件的情况的时候,截取后半段的数组
# 和takewhile相反
for i in itertools.dropwhile(lambda x: x<5, [1,4,6,4,1]):
print i
#%%
# izip_longest类似izip,但是izip是最短的配对,意味着长度为3的数组和
# 长度为5的数组,最后的输出是3个.但是该函数提供填补位,可以
# 指定缺失位置的数值
for i , z in itertools.izip_longest(xrange(10),xrange(5),fillvalue=3):
print i , z