Python語(yǔ)言的精華:Itertools庫(kù)
你知道Python的Itertools庫(kù)被認(rèn)為是Python的瑰寶嗎?一些用戶(hù)甚至認(rèn)為它是最酷和最令人驚嘆的Python庫(kù)之一。我們可以使用Itertools模塊來(lái)豐富我們的應(yīng)用程序,并在更短的時(shí)間內(nèi)創(chuàng)建一個(gè)可靠的工作解決方案。
本文將幫助讀者理解如何在項(xiàng)目中使用Itertools模塊。
文章分為三個(gè)部分,每個(gè)部分將解釋Itertools庫(kù)的特定功能。具體來(lái)說(shuō):
- 無(wú)限的迭代器
- 終止迭代器
- 組合迭代器
一、概念簡(jiǎn)介
1. 什么是迭代器?
迭代器是由__next__方法組成的對(duì)象。它有一個(gè)狀態(tài)。狀態(tài)用于記住迭代期間的執(zhí)行。因此,迭代器知道它的當(dāng)前狀態(tài),這使它的內(nèi)存效率高。這就是為什么在內(nèi)存高效和快速的應(yīng)用程序中使用迭代器的原因。
我們可以打開(kāi)無(wú)限的數(shù)據(jù)流(比如讀取文件)并獲取下一項(xiàng)(比如文件中的下一行)。然后我們可以對(duì)項(xiàng)目執(zhí)行一個(gè)操作,并繼續(xù)進(jìn)行下一個(gè)項(xiàng)目。這可能意味著我們可以有一個(gè)返回?zé)o限個(gè)元素的迭代器,因?yàn)槲覀冎恍枰喇?dāng)前項(xiàng)。
當(dāng)沒(méi)有下一個(gè)要返回的項(xiàng)時(shí),迭代器會(huì)引發(fā)StopIteration異常。
2. 什么是可迭代的?
iterable是可以返回迭代器的對(duì)象。它有一個(gè)__iter__方法返回一個(gè)迭代器。iterable也是一個(gè)我們可以循環(huán)并可以調(diào)用iter()的對(duì)象。它有一個(gè)__getitem__方法,它可以從0開(kāi)始去連續(xù)索引(并在索引不再有效時(shí)引發(fā)一個(gè)IndexError)。
3. 什么是Itertools?
Itertools是Python模塊,是Python 3標(biāo)準(zhǔn)庫(kù)的一部分。它允許我們?cè)诘魃蠄?zhí)行高效的內(nèi)存和計(jì)算任務(wù)。它的靈感來(lái)自APL、Haskell和SML的構(gòu)造。
從本質(zhì)上講,該模塊包含許多快速且內(nèi)存效率高的方法,這些方法可以幫助我們用純Python簡(jiǎn)潔而高效地構(gòu)建應(yīng)用程序。
二、無(wú)限迭代器
如果我們想構(gòu)造一個(gè)返回?zé)o限均勻間隔值的迭代器呢?或者,如果我們必須從迭代器生成一個(gè)元素循環(huán)呢?或者,也許我們想要重復(fù)迭代器的元素?
itertools庫(kù)提供了一組函數(shù),我們可以使用這些函數(shù)來(lái)執(zhí)行所需的所有功能。
本節(jié)中列出的三個(gè)函數(shù)構(gòu)造并返回可以是無(wú)限項(xiàng)流的迭代器。
1. Count
作為實(shí)例,我們可以生成一個(gè)等距值的無(wú)限序列:
- start = 10
- stop = 1
- my_counter = it.count(start, stop)
- for i in my_counter:
- # this loop will run for ever
- print(i)
結(jié)果:
- 10
- 11
- 12
- 13
- 14
- 15
2. Cycle
我們可以使用cycle方法從輸入中生成無(wú)限循環(huán)的元素。
該方法的輸入需要是可迭代的對(duì)象,比如列表、字符串或字典等:
- my_cycle = it.cycle('Python')
- for i in my_cycle: print(i)
結(jié)果:
- P
- ythonPythonP
3. Repeat
要重復(fù)一個(gè)項(xiàng)(例如字符串或集合),可以使用repeat()函數(shù):
- to_repeat = 'FM'
- how_many_times = 4
- my_repeater = it.repeat(to_repeat, how_many_times)for i in my_repeater: print(i)#Prints
- FM
- FM
- FM
- FM
這將重復(fù)字符串“FM”4次。如果我們不提供第二個(gè)參數(shù),那么它將無(wú)限次重復(fù)這個(gè)字符串。
三、終止迭代器
在本節(jié)中,我將說(shuō)明終止迭代的強(qiáng)大特性。這些函數(shù)可以用于許多場(chǎng)景,例如:
- 我們可能有很多迭代,我們想在一個(gè)序列中一個(gè)一個(gè)地對(duì)所有迭代的元素執(zhí)行一個(gè)操作。
- 或者當(dāng)我們有很多函數(shù)想要對(duì)iterable的每個(gè)元素執(zhí)行時(shí)
- 或者有時(shí)我們就從迭代器中刪除元素,然后對(duì)其他元素執(zhí)行操作。
1. Chain
這個(gè)方法允許我們創(chuàng)建一個(gè)迭代器,它返回序列中所有輸入迭代中的元素,直到?jīng)]有元素剩下為止。因此,它可以將連續(xù)序列視為單個(gè)序列。
- chain = it.chain([1,2,3], ['a','b','c'], ['End'])
- for i in chain: print(i)
結(jié)果:
- 1
- 23abcEnd
2. Drop While
我們可以傳遞一個(gè)iterable和一個(gè)條件,這個(gè)方法將開(kāi)始對(duì)每個(gè)元素計(jì)算條件,直到條件對(duì)一個(gè)元素返回False為止。一旦某個(gè)元素的條件值為False,該函數(shù)將返回可迭代的其余元素。
例如,假設(shè)我們有一個(gè)作業(yè)列表,并且我們希望遍歷元素,并且只有在不滿(mǎn)足條件時(shí)才返回元素。一旦條件的值為False,我們期望返回迭代器的其余元素。
- jobs = ['job1', 'job2', 'job3', 'job10', 'job4', 'job5']
- dropwhile = it.dropwhile(lambda x : len(x)==4, jobs)
- for i in dropwhile:
- print(i)
結(jié)果:
- job10
- job4job5
該方法返回了上面的三項(xiàng),因?yàn)樵豭ob10的長(zhǎng)度不等于4個(gè)字符,因此返回了job10和其他元素。
3. Take While
這個(gè)方法與dropwhile()方法相反。本質(zhì)上,它返回一個(gè)iterable的所有元素,直到第一個(gè)條件返回False,然后它不返回任何其他元素。
例如,假設(shè)我們有一個(gè)作業(yè)列表,并且希望在不滿(mǎn)足條件時(shí)立即停止返回作業(yè)。
- jobs = ['job1', 'job2', 'job3', 'job10', 'job4', 'job5']
- takewhile = it.takewhile(lambda x : len(x)==4, jobs)
- for i in takewhile:
- print(i)
結(jié)果:
- job1
- job2job3
4. GroupBy
這個(gè)函數(shù)在將可迭代的連續(xù)元素分組之后構(gòu)造一個(gè)迭代器。該函數(shù)返回一個(gè)鍵、值對(duì)的迭代器,其中鍵是組鍵,值是按鍵分組的連續(xù)元素的集合。
考慮以下代碼片段:
- iterable = 'FFFAARRHHHAADDMMAAALLIIKKK'
- my_groupby = it.groupby(iterable)for key, group in my_groupby:
- print('Key:', key)
- print('Group:', list(group))
注意,group屬性是可迭代的,因此我將其具體化為一個(gè)列表。
因此,這將打?。?/p>
- Key: F
- Group: [‘F’, ‘F’, ‘F’]
- Key: A
- Group: [‘A’, ‘A’]
- Key: R
- Group: [‘R’, ‘R’]
- Key: H
- Group: [‘H’, ‘H’, ‘H’]
- Key: A
- Group: [‘A’, ‘A’]
- Key: D
- Group: [‘D’, ‘D’]
- Key: M
- Group: [‘M’, ‘M’]
- Key: A
- Group: [‘A’, ‘A’, ‘A’]
- Key: L
- Group: [‘L’, ‘L’]
- Key: I
- Group: [‘I’, ‘I’]
- Key: K
- Group: [‘K’, ‘K’, ‘K’]
5. Tee
該方法可以拆分一個(gè)迭代,并從輸入中生成新的迭代。輸出也是一個(gè)迭代器,它返回給定數(shù)量的項(xiàng)的可迭代值。為了更好地理解它,請(qǐng)看下面的代碼片段:
- iterable = 'FM'
- tee = it.tee(iterable, 5)
- for i in tee: print(list(i))
這個(gè)方法返回整個(gè)可迭代FM, 5次:
- [‘F’, ‘M’]
- [‘F’, ‘M’][‘F’, ‘M’][‘F’, ‘M’][‘F’, ‘M’]
四、組合迭代器
1. Permutations
通過(guò)使用permutation方法,我們可以創(chuàng)建一個(gè)迭代器來(lái)返回輸入iterable中元素的連續(xù)排列。
我們可以傳入一個(gè)參數(shù)來(lái)指定排列的長(zhǎng)度。它默認(rèn)為可迭代的長(zhǎng)度。
這意味著當(dāng)缺少長(zhǎng)度時(shí),該方法將生成所有可能的全長(zhǎng)排列。
- iterable = 'FM1'
- length = 2
- permutations = it.permutations(iterable, length)
- for i in permutations:
- print(i)
結(jié)果:
- (‘F’, ‘M’, ‘1’)
- (‘F’, ‘1’, ‘M’)(‘M’, ‘F’, ‘1’)(‘M’, ‘1’, ‘F’)(‘1’, ‘F’, ‘M’)(‘1’, ‘M’, ‘F’)
如果長(zhǎng)度為2,則生成:
- (‘F’, ‘M’)
- (‘F’, ‘1’)(‘M’, ‘F’)(‘M’, ‘1’)(‘1’, ‘F’)(‘1’, ‘M’)(‘F’, ‘M’)(‘F’, ‘1’)(‘M’, ‘1’)
2. Combinations
最后,我想解釋一下如何生成iterable的組合。
給定一個(gè)可迭代器,我們可以構(gòu)造一個(gè)迭代器來(lái)返回給定長(zhǎng)度的元素的子序列。
根據(jù)它們的位置,元素被視為唯一的,并且只返回不同的元素。
- iterable = 'FM1'
- combinations = it.combinations(iterable, 2)
- for i in combinations: print(i)
結(jié)果:
- (‘F’, ‘M’)
- (‘F’, ‘1’)(‘M’, ‘1’)
英文原文:
https://medium.com/fintechexplained/advanced-python-itertools-library-the-gem-of-python-language-99da37dfcca2