很是簡單的介紹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