首頁  >  文章  >  後端開發  >  python迭代器以及itertools模組

python迭代器以及itertools模組

高洛峰
高洛峰原創
2017-02-22 10:28:401622瀏覽

迭代器       

#      在python中,迭代器協定是實作物件的__iter()方法和next()方法,其中前者回傳物件本身,後者返回容器的下一個元素。實作了這兩個方法的物件就是可迭代物件。迭代器是有惰性的,只有在使用時才會產生,這就為處理大量資料提供了好處,不同一次性把所有資料寫入記憶體。下面自己寫了一個迭代器,可以看到使用for迴圈可以處理自己寫的迭代器,實作了迭代器協定的對象,可以使用任何類似for迴圈這樣的迭代器工具。但是,看下面的輸出,第二次輸出為空,這是為什麼呢?當我們使用list時,我們可以多次輸出同一個對象,這和實作了自己實作了迭代器協定的對像有什麼不同?

class it(object):
   def __init__(self, n):
       self.a = 0
       self

   def next(self):
       if self.a < self.n:
           self.a += 1 # turn else:
           raise StopIteration

i=it(5)
for j in i:
   print j,
print ''
print '------'
for j in i:
   print j
# 1 2 3 4 5
# ------
      經過學習,得知,list等型別迭代器返回的是一個迭代器對象,不是返回了本身。那就寫瞭如下程式碼進行測試,經過列印輸出可以看到,類別TestIt的物件是可以重複使用的。那麼又有一個問題了,沒有實作next()方法的對象,還是迭代器對象嗎?這是因為在使用it類時,是返回了迭代器物件的,把迭代的功能使用了it迭代器實現,也就是說相當於實現了迭代器協定。迭代器協定在python中很有用,python中有一個關於迭代器的模組itertools,下面我就學習一下itertools模組,看看有哪些驚喜!
<br/>


itertools

無限迭代器

1 count(),接受兩個參數,第一個是開始的數字,第二個是步幅,預設從0開始,用法如下

class TestIt(object):
def __init__(self, a):
self.a = a 
def __iter__(self):
return it(self.a)

2 cycle(),接受一個參數,該參數是迭代器物件(列表,字串等),會循環產生迭代器中的元素

import itertools as it

c = it.count(10, 2)
for i in c:
    if i > 20:
        break
    print i,
# 10 12 14 16 18 20

3 repeat(),接受兩個參數,用於產生第一個參數n次

c = it.cycle([1, 2, 3])
i = 1
for j in c:
    if i > 7:
        break
    print j,
    i += 1

有限迭代器,選取感覺自己常用的介紹下

#1 chain(),接受多個迭代器物件作為參數,並把它們連接起來chain('abc', [1, 2, 3])

2 compress(data, selectors), 根據後面的參數過濾前面的參數,兩個參數都需要是迭代器物件

dropwhile

(

pre, iterable),pre參數為函數,當pre(i)是Ture是,傳回該項目以及後面所有項目

groupby(iterable[, keyfunc]),其中#iterable 是可迭代對象,keyfunc 是分組函數,用於對iterable 的連續項目被分組,如果不指定,則預設將iterable 中的連續相同項目分組,傳回一個 (key, sub-iterator) 的迭代器。 #

ifilter(function or None, sequence),将 iterable 中 function(item) 为 True 的元素组成一个迭代器返回,如果 function 是 None,则返回 iterable 中所有计算为 True 的项

6 tee(iterable [,n]),tee 用于从 iterable 创建 n 个独立的迭代器,以元组的形式返回,n 的默认值是 2。


 for j in it.tee(&#39;abc&#39;, 4):
     print list(j)


组合生成器

permutations(iterable[, r]),用于生成一个排列,r是生成排列的元素长度,不指定则为默认长度


  list(it.permutations(  list(it.permutations(, 2


combinations(iterable, r), 求序列的组合,其中,r 指定生成组合的元素的长度,是必需的参数

3 combinations_with_replacement(iterable, r),生成的组合包含自身元素 

 print list(it.combinations_with_replacement(&#39;abc&#39;, 2))
 # [(&#39;a&#39;, &#39;a&#39;), (&#39;a&#39;, &#39;b&#39;), (&#39;a&#39;, &#39;c&#39;), (&#39;b&#39;, &#39;b&#39;), (&#39;b&#39;, &#39;c&#39;), (&#39;c&#39;, &#39;c&#39;)]

更多python迭代器以及itertools模块相关文章请关注PHP中文网!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn