今天小編給大家分享一下Python迭代工具有哪些及怎么使用的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。
公司主營(yíng)業(yè)務(wù):成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶(hù)真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。創(chuàng)新互聯(lián)推出稷山免費(fèi)做網(wǎng)站回饋大家。
它的功能比乍看起來(lái)要強(qiáng)大的多。
使用range()
的第一個(gè)要點(diǎn)是理解參數(shù):range(start, stop)
. start
代表我們從start數(shù)字開(kāi)始計(jì)數(shù),包含start這個(gè)數(shù)字;stop
代表我們?cè)诘竭_(dá)stop數(shù)字后停止計(jì)數(shù),但不包括stop數(shù)字!
所以,如果我們有range(1, 10)
,就會(huì)得到[1, 2, 3, 4, 5, 6, 7, 8, 9]
。開(kāi)始于1
,但不能到10
。
如果我們想包含10
在我們的序列中,我們需要range(1, 11)
: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
。
順便說(shuō)一句,如果我們只指定一個(gè)參數(shù),例如range(10)
,它將假定范圍的開(kāi)始是0
。在這種情況下,我們會(huì)得到[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
. 當(dāng)range()
用于控制傳統(tǒng)的 for 循環(huán)時(shí),你會(huì)經(jīng)??吹揭赃@種方式使用它。
我最喜歡range()
的技巧是它的可選第三個(gè)參數(shù):當(dāng)你指定 range(start, stop, step)
時(shí),該step
參數(shù)允許你每次增加大于1
的值。
可以用在實(shí)現(xiàn)打印出 前100個(gè)7 的所有倍數(shù),從7
自身到700
,包括在內(nèi):range(7, 701, 7)
會(huì)這樣做。(請(qǐng)注意,我最后指定了701
,以確保包括700
在內(nèi)。)
也可以用在打印所有小于 100的奇數(shù): range(1, 100, 2)
。
如果你正在嘗試使用range,打印出7的所有倍數(shù),你可能會(huì)注意到結(jié)果并沒(méi)有達(dá)到你的預(yù)期:
sevens = range(7, 701, 7) print(sevens)
print 命令打印文字短語(yǔ)range(7, 701, 7)
。發(fā)現(xiàn)并不是我們想要的!
請(qǐng)記住,range()
返回一個(gè)類(lèi)似于迭代器的對(duì)象(python 2x返回的是列表)。要將其完全存儲(chǔ)為列表,我們需要通過(guò)將其包裝在函數(shù)list()
中來(lái)將其轉(zhuǎn)換為列表:
sevens = list(range(7, 701, 7)) print(sevens)
現(xiàn)在輸出就是我們想要的——前100個(gè) 7 的倍數(shù)的列表!
在我們進(jìn)入所有這些新的迭代優(yōu)點(diǎn)之前,我想向你介紹擴(kuò)展索引符號(hào),它使我們能夠更強(qiáng)大地從有序容器中選擇元素,例如列表。
說(shuō)到列表,來(lái)看看下面這個(gè):
dossiers = ['Sir Vile', 'Dr. Belljar', 'Baron Grinnit', 'Medeva', 'General Mayhem', 'Buggs Zapper', 'Jacqueline Hyde', 'Jane Reaction', 'Dee Cryption']
不管你是否意識(shí)到,你已經(jīng)知道正常的索引符號(hào)。
print(dossiers[1]) >>> Dr. Belljar
這返回了容器的第二個(gè)元素(索引1
) 。dossiers
很簡(jiǎn)單,對(duì)吧?幾乎所有語(yǔ)言都提供這種行為。
那么,如果我們想要第二個(gè)和第三個(gè)元素呢?
print(dossiers[1:3]) >>> ['Dr. Belljar', 'Baron Grinnit']
剛才發(fā)生了什么?在擴(kuò)展索引表示法中,我們有三個(gè)參數(shù),用冒號(hào)分隔:start
、stop
和step
。嘿,看起來(lái)很熟悉對(duì)吧?這些是range()
使用的相同參數(shù)!它們的工作方式也完全相同。(當(dāng)然,我們?cè)谏厦娴氖纠惺÷粤说谌齻€(gè)參數(shù) [ step
]。)
請(qǐng)注意,該示例打印出Dr. Belljar
(index 1
) 和Baron Grinnit
(index 2
),但不是 Medeva
,因?yàn)?code>stop參數(shù)被迫停止了。
千萬(wàn)要注意,start
一定要小于 stop
,你才能得到結(jié)果!不過(guò)有一個(gè)例外,我們稍后會(huì)談到。
現(xiàn)在,如果你想要從第二個(gè)開(kāi)始的所有其他元素怎么辦?
print(dossiers[1::2]) >>> ['Dr. Belljar', 'Medeva', 'Buggs Zapper', 'Jane Reaction']
你會(huì)注意到我們沒(méi)有指定stop
. 因?yàn)槲覀兤鋵?shí)不需要!擴(kuò)展索引符號(hào)允許你省略任何參數(shù),只要你有冒號(hào)來(lái)分隔開(kāi)。由于省略了第二個(gè)參數(shù),我們只是將多余的:
放在它本來(lái)應(yīng)該的位置之后。
擴(kuò)展索引符號(hào)使(start, stop, step)
邏輯更進(jìn)一步,允許你反向分割!一開(kāi)始這有點(diǎn)繞腦筋,但是請(qǐng)堅(jiān)持住……
print(dossiers[-1])
打印出列表中的最后一項(xiàng)。負(fù)數(shù)代表從列表末尾開(kāi)始計(jì)數(shù)!這感覺(jué)有點(diǎn)奇怪,因?yàn)槲覀兞?xí)慣于從0
索引開(kāi)始計(jì)數(shù),但負(fù)零并不是真正的有意義的數(shù),所以我們從-1
開(kāi)始。
鑒于此,我們?nèi)绾未蛴∽詈笕齻€(gè)項(xiàng)目?我們可能會(huì)這樣嘗試,但它實(shí)際上不起作用......
print(dossiers[-1:-4]) >>> []
這將返回一個(gè)空列表。為什么?請(qǐng)記住,start
必須小于 stop
,即使在使用負(fù)索引時(shí)也是如此。所以,我們必須把-4
作為我們的start
,因?yàn)?code>-4 < -1。
print(dossiers[-4:-1]) >>> ['Buggs Zapper', 'Jacqueline Hyde', 'Jane Reaction']
這更接近了,但仍然存在問(wèn)題。Dee Cryption
是我們的最后一個(gè)元素,它在哪里呢?記住,stop
是停止計(jì)數(shù)的數(shù)字,且不包含當(dāng)前數(shù)字。但我們不能只用dossiers[-4]
,因?yàn)槟侵粫?huì)給我們Buggs Zapper
。并且dossiers[-4:-0]
是無(wú)效。
要解決這個(gè)問(wèn)題的方法就是,告訴 Python 我們明確省略了第二個(gè)參數(shù):在我們的第一個(gè)參數(shù)后面加上一個(gè)冒號(hào)!
print(dossiers[-4:]) >>> ['Buggs Zapper', 'Jacqueline Hyde', 'Jane Reaction', 'Dee Cryption']
現(xiàn)在我們得到了最后一個(gè)元素。如果我們想要最后三個(gè),那就把-4
改為-3
......
print(dossiers[-3:]) >>> ['Jacqueline Hyde', 'Jane Reaction', 'Dee Cryption']
如果我們?cè)诘谌齻€(gè)參數(shù)step
中輸入一個(gè)負(fù)數(shù),你認(rèn)為會(huì)發(fā)生什么?讓我們嘗試-1
在它前面加上兩個(gè)冒號(hào),表示我們想要整個(gè)列表。
print(dossiers[::-1]) >>> ['Dee Cryption', 'Jane Reaction', 'Jacqueline Hyde', 'Buggs Zapper', 'General Mayhem', 'Medeva', 'Baron Grinnit', 'Dr. Belljar', 'Sir Vile']
看起來(lái)這是將所有內(nèi)容都逆向打印除了!事實(shí)上, step
設(shè)置為-1
顛倒了列表。
現(xiàn)在讓我們嘗試-2
...
print(dossiers[::-2]) >>> ['Dee Cryption', 'Jacqueline Hyde', 'General Mayhem', 'Baron Grinnit', 'Sir Vile']
這不僅反轉(zhuǎn)了列表,而且跳過(guò)了所有部分元素。負(fù)數(shù)的step
行為與正數(shù)完全相同step
,只是它逆向工作!
那么,如果我們想把所有東西放在一起怎么辦?也許我們想以相反的順序列出第二個(gè)、第三個(gè)和第四個(gè)元素......
print(dossiers[2:5:-1]) >>> []
注意: start
和stop
必須按順序遍歷。如果step
為正,則start
必須小于stop
;但是,如果step
為負(fù)數(shù),則start
必須大于stop
!
你可以把它想象成攝影之旅的步行路線(xiàn)。step
告訴你走哪條路,你的步幅應(yīng)該有多大。一到就開(kāi)始拍照start
,一遇到問(wèn)題就stop
收起相機(jī)。
所以,要解決這個(gè)問(wèn)題,我們需要交換我們的start
and stop
。
print(dossiers[5:2:-1]) >>> ['Buggs Zapper', 'General Mayhem', 'Medeva']
說(shuō)明: Python 還提供了slice()
anditertools.islice()
函數(shù),它們的行為方式大致相同。但是,它們都比擴(kuò)展索引符號(hào)更受限制,因此你最好使用擴(kuò)展索引符號(hào)而不是函數(shù)。
我們將在本節(jié)中探索的其余函數(shù)都與迭代對(duì)象一起使用。雖然我將在大多數(shù)示例中使用列表,但請(qǐng)記住,你可以使用任何可迭代的對(duì)象,包括range()
函數(shù)。
想象一下,你在一個(gè)可迭代的容器(例如列表)中獲得了一大堆數(shù)據(jù),例如包含數(shù)百個(gè)名稱(chēng)的列表。在將該列表輸入到你的超級(jí)算法之前,你希望通過(guò)檢查每個(gè)元素中是否存在異常值來(lái)節(jié)省一些處理時(shí)間。
這就是all
函數(shù)的用途。
dossiers = ['Sir Vile', 'Dr. Belljar', 'Baron Grinnit', 'Medeva', 'General Mayhem', 'Buggs Zapper', '', 'Jane Reaction', 'Dee Cryption'] print(all(dossiers)) >>> False
你可能還記得,空字符串 ( ''
)在 Python 中的計(jì)算結(jié)果為False
。該all()
函數(shù)評(píng)估每個(gè)元素,并確保它返回True
。如果甚至一個(gè)計(jì)算結(jié)果為False
,該all()
函數(shù)也將返回 false。
any()
以幾乎相同的方式工作,但是它只需要一個(gè)元素來(lái)評(píng)估True
.
乍一看,這些似乎不是很有用,但是當(dāng)與其他一些工具結(jié)合使用時(shí),甚至與列表解析(稍后部分)結(jié)合使用時(shí),它們可以節(jié)省大量時(shí)間!
在循環(huán)中,如果你需要訪(fǎng)問(wèn)列表的值及其索引,你可以使用該enumerate()
函數(shù)來(lái)完成。
foo = ['A', 'B', 'C', 'D', 'E'] for index, value in enumerate(foo): print(f'Element {index} is has the value {value}.')
但是enumerate()
,不僅限于列表。像所有這些其他函數(shù)一樣,它適用于任何可迭代的對(duì)象,需要返回編號(hào)(或枚舉)的每個(gè)值。例如,我們把它用在range()
。讓我們用它來(lái)打印從 10 到 100 ( range(10,101,10)
) 的每一個(gè) 10 的倍數(shù)。下面是舉例...
for index, value in enumerate(range(10,101,10)): print(f'Element {index} is has the value {value}.')
這給了我們...
Element 0 is has the value 10. Element 1 is has the value 20. Element 2 is has the value 30. Element 3 is has the value 40. Element 4 is has the value 50. Element 5 is has the value 60. Element 6 is has the value 70. Element 7 is has the value 80. Element 8 is has the value 90. Element 9 is has the value 100
我們可以從中得出一個(gè)簡(jiǎn)潔的模式,但我們必須從1而不是0開(kāi)始枚舉。果然,我們可以通過(guò)傳遞起始計(jì)數(shù)數(shù)字作為第二個(gè)參數(shù)來(lái)實(shí)現(xiàn)。我們還將稍微調(diào)整我們輸出的信息,簡(jiǎn)化一下輸出格式。
for index, value in enumerate(range(10,101,10), 1): print(f'{index} times 10 equals {value}')
當(dāng)我們運(yùn)行它時(shí),我們得到...
1 times 10 equals 10 2 times 10 equals 20 3 times 10 equals 30 4 times 10 equals 40 5 times 10 equals 50 6 times 10 equals 60 7 times 10 equals 70 8 times 10 equals 80 9 times 10 equals 90 10 times 10 equals 100
假設(shè)我們正在跟蹤在一堆地點(diǎn)找到的線(xiàn)索數(shù)量,將它們存儲(chǔ)在字典中。對(duì)于這個(gè)例子,我將在最后一節(jié)中借用和調(diào)整字典......
locations = { 'Parade Ground': 0, 'Ste.-Catherine Street': 0, 'Pont Victoria': 0, 'Underground City': 3, 'Mont Royal Park': 0, 'Fine Arts Museum': 0, 'Humor Hall of Fame': 2, 'Lachine Canal': 4, 'Montreal Jazz Festival': 1, 'Olympic Stadium': 0, 'St. Lawrence River': 2, 'Old Montréal': 0, 'McGill University': 0, 'Chalet Lookout': 0, '?le Notre-Dame': 0 }
也許我們需要找到所有有線(xiàn)索的地點(diǎn),而忽略其余的。我們將首先編寫(xiě)一個(gè)函數(shù)來(lái)測(cè)試特定的鍵值元組對(duì)。這似乎是一個(gè)荒謬的過(guò)度復(fù)雜化,但一會(huì)兒會(huì)有用:
def has_clues(pair): return bool(pair[1])
我們將字典中的每一對(duì)作為元組提交給函數(shù),pair[1]
將會(huì)是值(例如('Underground City', 3)
)。如果線(xiàn)索數(shù)字是0
,bool()
函數(shù)將返回False
,那其他所有為True
的元素,就是我們想要的。
我們使用filter()
對(duì)剛剛編寫(xiě)的函數(shù)來(lái)縮小字典范圍?;叵胍幌律弦还?jié),我們需要使用locations.items()
來(lái)獲取鍵和值作為一對(duì)。
for place, clues in filter(has_clues, locations.items()): print(place)
請(qǐng)注意,我們不包括has_clues
后面的括號(hào)。我們將實(shí)際函數(shù)作為對(duì)象傳遞!filter
將進(jìn)行實(shí)際調(diào)用。
果然,運(yùn)行該代碼會(huì)打印出我們有線(xiàn)索的五個(gè)地點(diǎn)(值 > 0
)......
Underground City Humor Hall of Fame Lachine Canal Montreal Jazz Festival St. Lawrence River
在本系列的后面部分,我們將學(xué)習(xí) lambdas匿名函數(shù),我們不用單獨(dú)定義函數(shù)。代碼如下......
for place, clues in filter(lambda x:bool(x[1]), locations.items()): print(place)
map()
函數(shù)的方式與 類(lèi)似filter()
,只是它不是使用函數(shù)從可迭代對(duì)象中省略元素,而是用于更改它們。
假設(shè)我們有一個(gè)華氏溫度列表:
temps = [67.0, 72.5, 71.3, 78.4, 62.1, 80.6]
我們想將這些都轉(zhuǎn)換為攝氏度,所以我們?yōu)榇司帉?xiě)了一個(gè)函數(shù)。
def f_to_c(temp): return round((temp - 32) / 1.8, 1)
我們可以使用該map()
函數(shù)將其應(yīng)用于temps
中的每個(gè)值,從而生成可以在循環(huán)(或任何地方)中使用的迭代器。
for c in map(f_to_c, temps): print(f'{c}°C')
請(qǐng)記住,我們將函數(shù)對(duì)象 f_to_c
作為map()
的第一個(gè)參數(shù)傳遞,所以我們?nèi)サ衾ㄌ?hào)!
運(yùn)行該循環(huán)輸出:
19.4°C 22.5°C 21.8°C 25.8°C 16.7°C 27.0°C
讓我們繼續(xù)使用剛剛的溫度列表例子。如果我們想在列表中找到最低或最高,我們可以分別使用min()
ormax()
函數(shù)。這沒(méi)什么新奇的。
temps = [67.0, 72.5, 71.3, 78.4, 62.1, 80.6] print(min(temps)) >>> 62.1 print(max(temps)) >>> 80.6
注意:與可迭代對(duì)象無(wú)關(guān),你還可以使用這些函數(shù)來(lái)查找你提供給它的參數(shù)列表中的最小或最大參數(shù),例如min(4, 5, 6, 7, 8)
,這將返回4
。
通常,你需要對(duì)可迭代對(duì)象進(jìn)行排序。Python 通過(guò)sorted()
內(nèi)置函數(shù)非常有效地做到了這一點(diǎn)。
temps = [67.0, 72.5, 71.3, 78.4, 62.1, 80.6] for t in sorted(temps): print(t)
輸出如下...
62.1 67.0 71.3 72.5 78.4 80.6
大多數(shù)時(shí)候,擴(kuò)展索引符號(hào)[::-1]
將允許你反轉(zhuǎn)列表或其他有序迭代。但如果這不是唯一辦法,你也可以使用reversed()
函數(shù)來(lái)反轉(zhuǎn)。
例如,我用sorted()
與剛才的函數(shù)結(jié)合起來(lái)......
temps = [67.0, 72.5, 71.3, 78.4, 62.1, 80.6] for t in reversed(sorted(temps)): print(t)
程序輸出如下...
80.6 78.4 72.5 71.3 67.0 62.1
另一個(gè)快速的內(nèi)置函數(shù)是sum()
,它將迭代中的所有元素添加在一起。當(dāng)然,這只有在所有元素都可以添加在一起時(shí)才有效。
這樣做的一種用途是更早地找到這些溫度的平均值。你可能還記得該len()
函數(shù)告訴我們?nèi)萜髦杏卸嗌僭亍?/p>
temps = [67.0, 72.5, 71.3, 78.4, 62.1, 80.6] average = sum(temps) / len(temps) print(round(average, 2)) >>> 71.98
還記得前面那個(gè)關(guān)于地點(diǎn)和線(xiàn)索的例子嗎?想象一下,我們得到的信息不是在字典中,而是在兩個(gè)列表中:
locations = ['Parade Ground', 'Ste.-Catherine Street', 'Pont Victoria', 'Underground City', 'Mont Royal Park', 'Fine Arts Museum', 'Humor Hall of Fame', 'Lachine Canal', 'Montreal Jazz Festival', 'Olympic Stadium', 'St. Lawrence River', 'Old Montréal', 'McGill University', 'Chalet Lookout', '?le Notre-Dame'] clues = [0, 0, 0, 3, 0, 0, 2, 4, 1, 0, 2, 0, 0, 0, 0]
那么剛剛的方法就不能實(shí)現(xiàn)查找了,但是在現(xiàn)實(shí)世界中確實(shí)存在我們會(huì)以這種方式獲取數(shù)據(jù)的場(chǎng)景。
值得慶幸的是,zip()
函數(shù)可以幫助我們處理這些數(shù)據(jù),方法是使用迭代器將其聚合成元組,給我們(locations[0], clues[0]), (locations[1], clues[1]), (locations[2], clues[2])
等等。
zip()
函數(shù)甚至不限于兩個(gè)迭代;它可以盡可能多地壓縮在一起!如果迭代的長(zhǎng)度不同,“額外”內(nèi)容會(huì)被放到最后。
當(dāng)然,在這種情況下,兩個(gè)列表的長(zhǎng)度相同,所以結(jié)果是相當(dāng)明顯的。讓我們使用 zip 中的數(shù)據(jù)創(chuàng)建一個(gè)新列表,并將其打印出來(lái)。
data = list(zip(locations, clues)) print(data)
這給了我們一個(gè)與我們.items()
之前從字典函數(shù)中得到的結(jié)構(gòu)不同的結(jié)構(gòu)!
[('Parade Ground', 0), ('Ste.-Catherine Street', 0), ('Pont Victoria', 0), ('Underground City', 3), ('Mont Royal Park', 0), ('Fine Arts Museum', 0), ('Humor Hall of Fame', 2), ('Lachine Canal', 4), ('Montreal Jazz Festival', 1), ('Olympic Stadium', 0), ('St. Lawrence River', 2), ('Old Montréal', 0), ('McGill University', 0), ('Chalet Lookout', 0), ('?le Notre-Dame', 0)]
事實(shí)上,如果我回憶起我filter()
的 lambda 函數(shù),我可以將它調(diào)整為 use zip
,讓我們完全從兩個(gè)列表中工作:
for place, clues in filter(lambda x:bool(x[1]), zip(locations, clues)): print(place)
和以前一樣,輸出...
Underground City Humor Hall of Fame Lachine Canal Montreal Jazz Festival St. Lawrence River
我已經(jīng)介紹了幾乎所有 Python 用于處理可迭代對(duì)象的內(nèi)置函數(shù),但itertools
模塊中還有更多內(nèi)容。我強(qiáng)烈建議閱讀官方文檔以了解更多信息。
以上就是“Python迭代工具有哪些及怎么使用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站標(biāo)題:Python迭代工具有哪些及怎么使用
標(biāo)題URL:http://www.rwnh.cn/article6/jjeoig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、定制開(kāi)發(fā)、網(wǎng)站導(dǎo)航、建站公司、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)