1. 程式人生 > >python itertools 模組講解

python itertools 模組講解

1、介紹
itertools 是python的迭代器模組,itertools提供的工具相當高效且節省記憶體。
使用這些工具,你將能夠建立自己定製的迭代器用於高效率的迴圈。
- 無限迭代器
 itertools包自帶了三個可以無限迭代的迭代器。這意味著,當你使用他們時,你要知道要的到底是最終會停止的迭代器,還是需要無限地迭代鞋去。
(1)count(初值=0, 步長=1):count 迭代器會返回從傳入的起始引數開始的均勻間隔的數值。count 也可以接收指定的步長引數。我們來看一個簡單的例子:

>>> 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 次之後停止“。

>>> 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 模組,然後新增進去:

>>> 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 迭代器能夠將多個可迭代物件合併成一個更長的可迭代物件。實際上,我參與的一個專案中最近就需要這一功能。我有一個列表,裡面已經包含一些元素,接著想把另外兩個列表新增到最初那個列表中。注意,我們想新增的是兩個列表的元素。最初,我是這樣做的:
    方式一: 

>>> 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,也有其他方法能夠實現這一要求。你可以這樣做:
    方式三:

>>> my_list = ['foo', 'bar']
>>> my_list += cmd + numbers
>>> my_list
['foo', 'bar', 'ls', '/some/dir', 0, 1, 2, 3, 4]

   這些方法當然都是可行的。在我知道 chain 之前,我可能會這樣做,但我個人認為這個例子中, chain 更為優雅,也更容易理解。

未完待續。。。。