很是简单的介绍itertools,仅仅是为了本身能边历全部的python标准库的手法之一,如下是经常使用的
itertools中的函数。python
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