1、介紹
itertools 是python的迭代器模塊,itertools提供的工具相當(dāng)高效且節(jié)省內(nèi)存。
使用這些工具,你將能夠創(chuàng)建自己定制的迭代器用于高效率的循環(huán)。
- 無(wú)限迭代器
itertools包自帶了三個(gè)可以無(wú)限迭代的迭代器。這意味著,當(dāng)你使用他們時(shí),你要知道要的到底是最終會(huì)停止的迭代器,還是需要無(wú)限地迭代鞋去。
(1)count(初值=0, 步長(zhǎng)=1):count 迭代器會(huì)返回從傳入的起始參數(shù)開始的均勻間隔的數(shù)值。count 也可以接收指定的步長(zhǎng)參數(shù)。我們來(lái)看一個(gè)簡(jiǎn)單的例子:
'''
遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:857662006
尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書!
'''
>>> from itertools import count
>>> for i in count(10): #從10開始無(wú)限循環(huán)
... 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 個(gè)元素后結(jié)束。islice 的第二個(gè)參數(shù)控制何時(shí)停止迭代。但其含義并不是”達(dá)到數(shù)字 5 時(shí)停止“,而是”當(dāng)?shù)?5 次之后停止“。
>>> from itertools import islice
>>> for i in islice(count(10), 5):
... print(i)
...
10
11
12
13
14
(3)cycle:這里我們創(chuàng)建了一個(gè) for 循環(huán),使其在三個(gè)字母 XYZ 間無(wú)限循環(huán)。當(dāng)然,我們并不真地想要永遠(yuǎn)循環(huán)下去,所以我們添加了一個(gè)簡(jiǎn)單的計(jì)數(shù)器來(lái)跳出循環(huán)。
'''
遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:857662006
尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書!
'''
>>> 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(可迭代對(duì)象[, 函數(shù)])
accumulate 迭代器將返回累計(jì)求和結(jié)果,或者傳入兩個(gè)參數(shù)的話,由傳入的函數(shù)累積計(jì)算的結(jié)果。默認(rèn)設(shè)定為相加,我們趕快試一試吧:
>> from itertools import accumulate
>>> list(accumulate(range(10)))
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
這里,我們 導(dǎo)入了 accumulate,然后傳入 10 個(gè)數(shù)字,0-9。迭代器將傳入數(shù)字依次累加,所以第一個(gè)是 0 ,第二個(gè)是 0+1, 第三個(gè)是 1+2,如此下去?,F(xiàn)在我們導(dǎo)入 operator 模塊,然后添加進(jìn)去:
>>> import operator
>>> list(accumulate(range(1, 5), operator.mul))
[1, 2, 6, 24]
這里我們傳入了數(shù)字 1-4 到 accumulate 迭代器中。我們還傳入了一個(gè)函數(shù):operator.mul,這個(gè)函數(shù)將接收的參數(shù)相乘。所以每一次迭代,迭代器將以乘法代替除法(1×1=1, 1×2=2, 2×3=6, 以此類推)。
accumulate 的文檔中給出了其他一些有趣的例子,例如貸款分期償還,混沌遞推關(guān)系等。這絕對(duì)值得你花時(shí)間去看一看。
(2)chain(*可迭代對(duì)象)
chain 迭代器能夠?qū)⒍鄠€(gè)可迭代對(duì)象合并成一個(gè)更長(zhǎng)的可迭代對(duì)象。實(shí)際上,我參與的一個(gè)項(xiàng)目中最近就需要這一功能。我有一個(gè)列表,里面已經(jīng)包含一些元素,接著想把另外兩個(gè)列表添加到最初那個(gè)列表中。注意,我們想添加的是兩個(gè)列表的元素。最初,我是這樣做的:
方式一:
'''
遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:857662006
尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書!
'''
>>> 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 模塊提供一個(gè)優(yōu)雅得多的方法用chain 來(lái)合并這些列表:
方式二:
>>> from itertools import chain
>>> my_list = list(chain(['foo', 'bar'], cmd, numbers))
>>> my_list
['foo', 'bar', 'ls', '/some/dir', 0, 1, 2, 3, 4]
許多聰明的讀者可能想到了,實(shí)際上不使用 itertools,也有其他方法能夠?qū)崿F(xiàn)這一要求。你可以這樣做:
方式三:
'''
遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:857662006
尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書!
'''
>>> my_list = ['foo', 'bar']
>>> my_list += cmd + numbers
>>> my_list
['foo', 'bar', 'ls', '/some/dir', 0, 1, 2, 3, 4]
這些方法當(dāng)然都是可行的。在我知道 chain 之前,我可能會(huì)這樣做,但我個(gè)人認(rèn)為這個(gè)例子中, chain 更為優(yōu)雅,也更容易理解。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
本文題目:pythonitertools模塊講解-創(chuàng)新互聯(lián)
文章位置:http://chinadenli.net/article40/idgeo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、網(wǎng)站導(dǎo)航、網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容