1、介紹
itertools 是python的迭代器模塊,itertools提供的工具相當高效且節省內存。
使用這些工具,你將能夠創建自己定制的迭代器用於高效率的循環。
- 無限迭代器
itertools包自帶了三個可以無限迭代的迭代器。這意味着,當你使用他們時,你要知道要的到底是最終會停止的迭代器,還是需要無限地迭代鞋去。
(1)count(初值=0, 步長=1):count 迭代器會返回從傳入的起始參數開始的均勻間隔的數值。count 也可以接收指定的步長參數。我們來看一個簡單的例子:
1 from itertools import count 2 for i in count(): 3 print i 4 if i > 10: 5 break 6 7 #從0開始循環 8 0 9 1 10 2 11 3 12 4 13 5 14 6 15 7 16 8 17 9 18 10 19 11
(2)islice(count(10), 5):從 10 開始,輸出 5 個元素后結束。islice 的第二個參數控制何時停止迭代。但其含義並不是”達到數字 5 時停止“,而是”當迭代了 5 次之后停止“。
1 from itertools import count,islice 2 for i in islice(count(10),5): 3 print i 4 5 #從10開始循環迭代5次后退出循環 6 10 7 11 8 12 9 13 10 14
(3)cycle:這里我們創建了一個 for 循環,使其在三個字母 XYZ 間無限循環。當然,我們並不真地想要永遠循環下去,所以我們添加了一個簡單的計數器來跳出循環。
1 from itertools import cycle 2 count = 0 3 for item in cycle('XYZ'): 4 if count > 7: 5 break 6 print item 7 count = count + 1 8 9 #在xyz之間無限循環 10 X 11 Y 12 Z 13 X 14 Y 15 Z 16 X
(4)accumulate(可迭代對象[, 函數])(適用於python3)
accumulate 迭代器將返回累計求和結果,或者傳入兩個參數的話,由傳入的函數累積計算的結果。默認設定為相加
這里,我們 導入了 accumulate,然后傳入 10 個數字,0-9。迭代器將傳入數字依次累加,所以第一個是 0 ,第二個是 0+1, 第三個是 1+2,如此下去。
現在我們導入 operator 模塊,然后添加進去:
1 >>> from itertools import accumulate 2 >>> list(accumulate(range(10))) 3 [0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
這里我們傳入了數字 1-4 到 accumulate 迭代器中。我們還傳入了一個函數:operator.mul,這個函數將接收的參數相乘。
所以每一次迭代,迭代器將以乘法代替除法(1×1=1, 1×2=2, 2×3=6, 以此類推)
1 from itertools import accumulate 2 import operator 3 >>> list(accumulate(range(1, 6), operator.mul)) 4 [1, 2, 6, 24, 120]
(5)chain(*可迭代對象)
chain 可以把一組迭代對象串聯起來,形成一個更大的迭代器:
1 from itertools import chain 2 for c in chain(['a','b','cd'],['ef',123],'XYZ'): 3 print c 4 5 #輸出 6 a 7 b 8 cd 9 ef 10 123 11 X 12 Y 13 Z 14 15 #備注類似於多個list疊加 16 mm = ['a','b','cd'] + ['ef',123] + ['X','Y','Z']
(6)groupby
把迭代器中相鄰的重復元素挑出來放在一起.
1 from itertools import groupby 2 3 for key, group in groupby('AAABBBCCAAA'): 4 print key,list(group) 5 6 #輸出 7 A ['A', 'A', 'A'] 8 B ['B', 'B', 'B'] 9 C ['C', 'C'] 10 A ['A', 'A', 'A']