溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python迭代器和for循環(huán)的區(qū)別是什么

發(fā)布時(shí)間:2020-09-09 14:30:49 來源:億速云 閱讀:598 作者:小新 欄目:編程語言

python迭代器和for循環(huán)的區(qū)別是什么?這個(gè)問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個(gè)問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!

迭代器(iterator):迭代器對(duì)象必須同時(shí)實(shí)現(xiàn)__iter__和__next__方法才是迭代器。對(duì)于迭代器來說,__iter__ 返回的是它自身 self,__next__ 則是返回迭代器中的下一個(gè)值,最后沒有元素時(shí),拋出異常(異常可以被開發(fā)者看到)。

1.迭代器一定是可迭代對(duì)象,因?yàn)樗鼘?shí)現(xiàn)了__iter__()方法;

2.通過iter()方法(在類的內(nèi)部就是__iter__)能夠使一個(gè)可迭代對(duì)象返回一個(gè)迭代器。

3.迭代器的 __iter__ 方法返回的是自身,并不產(chǎn)生新的迭代器對(duì)象。

第3點(diǎn)性質(zhì)正是可迭代對(duì)象可以重復(fù)遍歷的原因(每次返回一個(gè)獨(dú)立的迭代器,就可以保證不同的迭代過程不會(huì)互相影響);而迭代器由于返回自身,因此只能遍歷一次。

for循環(huán)的工作機(jī)制

當(dāng)對(duì)象本身就是迭代器時(shí),F(xiàn)or循環(huán)工作機(jī)制:

調(diào)用 __iter__方法,返回自身self,也就是返回迭代器。不斷地調(diào)用迭代器的next()方法,每次按序返回迭代器中的一個(gè)值。迭代到最后沒有元素時(shí),就拋出異常 StopIteration

在可迭代對(duì)象中,for循環(huán)工作機(jī)制:

先判斷對(duì)象是否為可迭代對(duì)象(等價(jià)于判斷有沒有__iter__或__getitem__方法),沒有的話直接報(bào)錯(cuò),拋出TypeError異常。有的話,調(diào)用 __iter__方法,返回一個(gè)迭代器。在python內(nèi)部不斷地調(diào)用迭代器的__next__方法,每次按序返回迭代器中的一個(gè)值。迭代到最后沒有元素時(shí),就拋出異常 StopIteration,這個(gè)異常 python 自己會(huì)處理,不會(huì)暴露給開發(fā)者。

此外,還要注意,python中的for循環(huán)其實(shí)兼容了兩種機(jī)制:

如果對(duì)象有__iter__會(huì)返回一個(gè)迭代器。如果對(duì)象沒有__iter__,但是實(shí)現(xiàn)了__getitem__,會(huì)改用下標(biāo)迭代的方式。__getitem__可以幫助一個(gè)對(duì)象進(jìn)行取數(shù)和切片操作。

當(dāng)for發(fā)現(xiàn)沒有__iter__但是有__getitem__的時(shí)候,會(huì)從0開始依次讀取相應(yīng)的下標(biāo),直到發(fā)生IndexError為止,這是一種舊的迭代協(xié)議。iter方法也會(huì)處理這種情況,在不存在__iter__的時(shí)候,返回一個(gè)下標(biāo)迭代的iterator對(duì)象來代替。一個(gè)重要的例子是str,字符串就是沒有__iter__方法的,但是卻依然可以迭代,原因就是其在for循環(huán)時(shí)調(diào)用了__getitem__方法。

感謝各位的閱讀!看完上述內(nèi)容,你們對(duì)python迭代器和for循環(huán)的區(qū)別是什么大概了解了嗎?希望文章內(nèi)容對(duì)大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI