一、介紹
itertools 是python的迭代器模塊,itertools提供的工具至關高效且節省內存。
使用這些工具,你將可以建立本身定製的迭代器用於高效率的循環。
- 無限迭代器
itertools包自帶了三個能夠無限迭代的迭代器。這意味着,當你使用他們時,你要知道要的究竟是最終會中止的迭代器,仍是須要無限地迭代鞋去。
(1)count(初值=0, 步長=1):count 迭代器會返回從傳入的起始參數開始的均勻間隔的數值。count 也能夠接收指定的步長參數。咱們來看一個簡單的例子:python
>>> from itertools import count >>> for i in count(10): #從10開始無限循環 ... if i > 20: ... break ... else: ... print(i) ... 10 11 12 13 14 15 16 17 18 19 20
(2)islice(count(10), 5):從 10 開始,輸出 5 個元素後結束。islice 的第二個參數控制什麼時候中止迭代。但其含義並非」達到數字 5 時中止「,而是」當迭代了 5 次以後中止「。app
>>> from itertools import islice >>> for i in islice(count(10), 5): ... print(i) ... 10
11
12
13
14
(3)cycle:這裏咱們建立了一個 for 循環,使其在三個字母 XYZ 間無限循環。固然,咱們並不真地想要永遠循環下去,因此咱們添加了一個簡單的計數器來跳出循環。函數
>>> from itertools import cycle >>> count = 0 >>> for item in cycle('XYZ'): ... if count > 7: ... break ... print(item) ... count += 1 ... X Y Z X Y Z X Y
- 可終止迭代器
(1)accumulate(可迭代對象[, 函數])
accumulate 迭代器將返回累計求和結果,或者傳入兩個參數的話,由傳入的函數累積計算的結果。默認設定爲相加,咱們趕快試一試吧:工具
>> from itertools import accumulate >>> list(accumulate(range(10))) [0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
這裏,咱們 導入了 accumulate,而後傳入 10 個數字,0-9。迭代器將傳入數字依次累加,因此第一個是 0 ,第二個是 0+1, 第三個是 1+2,如此下去。如今咱們導入 operator 模塊,而後添加進去:spa
>>> import operator >>> list(accumulate(range(1, 5), operator.mul)) [1, 2, 6, 24]
這裏咱們傳入了數字 1-4 到 accumulate 迭代器中。咱們還傳入了一個函數:operator.mul,這個函數將接收的參數相乘。因此每一次迭代,迭代器將以乘法代替除法(1×1=1, 1×2=2, 2×3=6, 以此類推)。
accumulate 的文檔中給出了其餘一些有趣的例子,例如貸款分期償還,混沌遞推關係等。這絕對值得你花時間去看一看。
(2)chain(*可迭代對象)
chain 迭代器可以將多個可迭代對象合併成一個更長的可迭代對象。實際上,我參與的一個項目中最近就須要這一功能。我有一個列表,裏面已經包含一些元素,接着想把另外兩個列表添加到最初那個列表中。注意,咱們想添加的是兩個列表的元素。最初,我是這樣作的:
方式一: code
>>> my_list = ['foo', 'bar'] >>> numbers = list(range(5)) >>> cmd = ['ls', '/some/dir'] >>> my_list.append(cmd) >>> my_list.append(numbers) >>> my_list ['foo', 'bar', ['ls', '/some/dir'], [0, 1, 2, 3, 4]]
這並非我想要的。itertools 模塊提供一個優雅得多的方法用chain 來合併這些列表:
方式二:對象
>>> from itertools import chain >>> my_list = list(chain(['foo', 'bar'], cmd, numbers)) >>> my_list ['foo', 'bar', 'ls', '/some/dir', 0, 1, 2, 3, 4]
許多聰明的讀者可能想到了,實際上不使用 itertools,也有其餘方法可以實現這一要求。你能夠這樣作:
方式三:blog
>>> my_list = ['foo', 'bar'] >>> my_list += cmd + numbers >>> my_list ['foo', 'bar', 'ls', '/some/dir', 0, 1, 2, 3, 4]
這些方法固然都是可行的。在我知道 chain 以前,我可能會這樣作,但我我的認爲這個例子中, chain 更爲優雅,也更容易理解。內存
未完待續。。。。文檔