itertools函式解析
原始網頁:https://www.cnblogs.com/fengshuihuan/p/7105545.html
這貨很強大, 必須掌握
文件 連結 http://docs.python.org/2/library/itertools.html
pymotw 連結 http://pymotw.com/2/itertools/
基本是基於文件的翻譯和補充,相當於翻譯了
itertools用於高效迴圈的迭代函式集合
組成
總體,整體瞭解
無限迭代器
1 2 3 4 |
'ABCD' ) - - > A B C D A B C D ...
|
處理輸入序列迭代器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
組合生成器
1 2 3 4 5 6 7 8 9 |
|
第一部分
itertools.count(start=0, step=1)
建立一個迭代器,生成從n開始的連續整數,如果忽略n,則從0開始計算(注意:此迭代器不支援長整數)
如果超出了sys.maxint,計數器將溢位並繼續從-sys.maxint-1開始計算。
定義
1 2 3 4 5 6 7 |
|
等同於(start + step * i for i in count())
使用
1 2 3 4 5 6 7 8 9 |
|
itertools.repeat(object[, times])
建立一個迭代器,重複生成object,times(如果已提供)指定重複計數,如果未提供times,將無止盡返回該物件。
定義
1 2 3 4 5 6 7 8 |
|
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
第二部分
itertools.chain(*iterables)
將多個迭代器作為引數, 但只返回單個迭代器, 它產生所有引數迭代器的內容, 就好像他們是來自於一個單一的序列.
1 2 3 4 5 |
|
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
itertools.compress(data, selectors)
提供一個選擇列表,對原始資料進行篩選
1 2 3 4 |
|
建立一個迭代器,只要函式predicate(item)為True,就丟棄iterable中的項,如果predicate返回False,就會生成iterable中的項和所有後續項。
即:在條件為false之後的第一次, 返回迭代器中剩下來的項.
1 2 3 4 5 6 7 8 9 10 |
|
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
itertools.groupby(iterable[, key])
返回一個產生按照key進行分組後的值集合的迭代器.
如果iterable在多次連續迭代中生成了同一項,則會定義一個組,如果將此函式應用一個分類列表,那麼分組將定義該列表中的所有唯一項,key(如果已提供)是一個函式,應用於每一項,如果此函式存在返回值,該值將用於後續項而不是該項本身進行比較,此函式返回的迭代器生成元素(key, group),其中key是分組的鍵值,group是迭代器,生成組成該組的所有項。
即:按照keyfunc函式對序列每個元素執行後的結果分組(每個分組是一個迭代器), 返回這些分組的迭代器
等價於
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
應用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
另一個例子
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
itertools.ifilter(predicate, iterable)
返回的是迭代器類似於針對列表的內建函式 filter() , 它只包括當測試函式返回true時的項. 它不同於 dropwhile()
建立一個迭代器,僅生成iterable中predicate(item)為True的項,如果predicate為None,將返回iterable中所有計算為True的項
對函式func執行返回真的元素的迭代器
1 2 3 4 5 6 7 8 |
|
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
itertools.ifilterfalse(predicate, iterable)
和ifilter(函式相反 , 返回一個包含那些測試函式返回false的項的迭代器)
建立一個迭代器,僅生成iterable中predicate(item)為False的項,如果predicate為None,則返回iterable中所有計算為False的項 對函式func執行返回假的元素的迭代器
1 2 3 4 5 6 7 8 |
|
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
itertools.islice(iterable, stop)
itertools.islice(iterable, start, stop[, step])
返回的迭代器是返回了輸入迭代器根據索引來選取的項
建立一個迭代器,生成項的方式類似於切片返回值: iterable[start : stop : step],將跳過前start個項,迭代在stop所指定的位置停止,step指定用於跳過項的步幅。 與切片不同,負值不會用於任何start,stop和step, 如果省略了start,迭代將從0開始,如果省略了step,步幅將採用1.
返回序列seq的從start開始到stop結束的步長為step的元素的迭代器
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|
itertools.imap(function, *iterables)
建立一個迭代器,生成項function(i1, i2, ..., iN),其中i1,i2...iN分別來自迭代器iter1,iter2 ... iterN,如果function為None,則返回(i1, i2, ..., iN)形式的元組,只要提供的一個迭代器不再生成值,迭代就會停止。
即:返回一個迭代器, 它是呼叫了一個其值在輸入迭代器上的函式, 返回結果. 它類似於內建函式 map() , 只是前者在任意輸入迭代器結束後就停止(而不是插入None值來補全所有的輸入).
返回序列每個元素被func執行後返回值的序列的迭代器
1 2 3 4 5 6 7 8 9 10 |
|
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
itertools.starmap(function, iterable)
建立一個迭代器,生成值func(*item),其中item來自iterable,只有當iterable生成的項適用於這種呼叫函式的方式時,此函式才有效。
對序列seq的每個元素作為func的引數列表執行, 返回執行結果的迭代器
1 2 3 4 |
|
使用
1 2 3 4 5 6 7 8 9 10 11 12 |
|
itertools.tee(iterable[, n=2])
返回一些基於單個原始輸入的獨立迭代器(預設為2). 它和Unix上的tee工具有點語義相似, 也就是說它們都重複讀取輸入裝置中的值並將值寫入到一個命名檔案和標準輸出中
從iterable建立n個獨立的迭代器,建立的迭代器以n元組的形式返回,n的預設值為2,此函式適用於任何可迭代的物件,但是,為了克隆原始迭代器,生成的項會被快取,並在所有新建立的迭代器中使用,一定要注意,不要在呼叫tee()之後使用原始迭代器iterable,否則快取機制可能無法正確工作。
把一個迭代器分為n個迭代器, 返回一個元組.預設是兩個
1 2 3 4 5 6 7 8 9 10 11 |
|
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
itertools.takewhile(predicate, iterable)
和dropwhile相反
建立一個迭代器,生成iterable中predicate(item)為True的項,只要predicate計算為False,迭代就會立即停止。
即:從序列的頭開始, 直到執行函式func失敗.
1 2 3 4 5 6 7 |
|
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
itertools.izip(*iterables)
返回一個合併了多個迭代器為一個元組的迭代器. 它類似於內建函式zip(), 只是它返回的是一個迭代器而不是一個列表
建立一個迭代器,生成元組(i1, i2, ... iN),其中i1,i2 ... iN 分別來自迭代器iter1,iter2 ... iterN,只要提供的某個迭代器不再生成值,迭代就會停止,此函式生成的值與內建的zip()函式相同。
1 2 3 4 5 6 7 8 9 |
|
使用
1 2 3 4 5 6 7 8 |
|
itertools.izip_longest(*iterables[, fillvalue])
與izip()相同,但是迭代過程會持續到所有輸入迭代變數iter1,iter2等都耗盡為止,如果沒有使用fillvalue關鍵字引數指定不同的值,則使用None來填充已經使用的迭代變數的值。
1 |