欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中的迭代器你了解嗎

 更新時(shí)間:2023年05月24日 09:54:13   作者:答案永恒  
迭代器是一種特殊的對(duì)象,它實(shí)現(xiàn)了迭代協(xié)議,允許按照一定的順序逐個(gè)訪問(wèn)元素,本文就來(lái)帶大家深入了解一下Python中迭代器的使用,需要的可以參考下

for loop和迭代器

在Python中,for循環(huán)是一種常用的迭代結(jié)構(gòu),用于遍歷可迭代對(duì)象中的元素。迭代器是一種特殊的對(duì)象,它實(shí)現(xiàn)了迭代協(xié)議,允許按照一定的順序逐個(gè)訪問(wèn)元素。

for循環(huán)和迭代器之間存在密切的關(guān)系,實(shí)際上,for循環(huán)是基于迭代器工作的。當(dāng)使用for循環(huán)遍歷可迭代對(duì)象時(shí),Python會(huì)在內(nèi)部自動(dòng)創(chuàng)建一個(gè)迭代器對(duì)象,并使用該迭代器來(lái)逐個(gè)獲取元素,直到所有元素都被訪問(wèn)完畢。

for loop里面in后面那個(gè)東西必須是一個(gè)iterable, 也就是必須是一個(gè)可迭代對(duì)象。

下面是一個(gè)示例,演示了for循環(huán)和迭代器之間的關(guān)系:

fruits?=?['apple',?'banana',?'orange']

#?使用for循環(huán)遍歷列表元素
for?fruit?in?fruits:
????print(fruit)

#?上述代碼等價(jià)于下面的迭代器方式
iterator?=?iter(fruits)??#?創(chuàng)建迭代器對(duì)象
while?True:
????try:
????????fruit?=?next(iterator)??#?獲取下一個(gè)元素
????????print(fruit)
????except?StopIteration:
????????break

在上面的示例中,我們首先使用for循環(huán)遍歷了列表fruits中的元素,打印出每個(gè)水果的名稱。然后,我們手動(dòng)創(chuàng)建了一個(gè)迭代器對(duì)象iterator,并使用next()函數(shù)逐個(gè)獲取元素,直到遇到StopIteration異常,表示所有元素都被訪問(wèn)完畢。

可以看到,使用for循環(huán)可以簡(jiǎn)化迭代過(guò)程,不需要顯式地創(chuàng)建迭代器對(duì)象和處理StopIteration異常。Python的許多內(nèi)置對(duì)象(如列表、元組、字典等)都是可迭代的,因此可以直接在for循環(huán)中使用它們。

列表

lst?=?[1,?2,?3]
for?i?in?lst:
????print(i)

字典

d?=?{"a":?1,?"b":?2}
for?i?in?d:
????print(i)

文件操作

with?open(my.txt,?"r")?as?f:
????for?i?in?f:
????????print(i)

除了內(nèi)置的可迭代對(duì)象,你還可以自定義迭代器類,實(shí)現(xiàn)自己的迭代邏輯。這樣,你就可以在for循環(huán)中使用自定義的迭代器來(lái)遍歷特定的數(shù)據(jù)結(jié)構(gòu)或?qū)崿F(xiàn)特定的迭代行為。

for loop的背后核心是迭代器可迭代對(duì)象

迭代器和可迭代對(duì)象

https://docs.python.org/3/glossary.html

在Python中,可迭代對(duì)象和迭代器是兩個(gè)相關(guān)但不同的概念。

可迭代對(duì)象(Iterable)是指實(shí)現(xiàn)了__iter__()方法的對(duì)象,或者實(shí)現(xiàn)了__getitem__()方法且可按照順序訪問(wèn)的對(duì)象。這兩者都是為了保證它可以在iter這個(gè)函數(shù)的作用下返回一個(gè)iterator。可迭代對(duì)象可以被迭代,也就是可以在for循環(huán)中使用。常見(jiàn)的可迭代對(duì)象包括列表、元組、字符串、字典、集合等。

迭代器(Iterator)是一種特殊的對(duì)象,它實(shí)現(xiàn)了迭代協(xié)議,具有__iter__()__next__()方法。迭代器用于逐個(gè)返回可迭代對(duì)象中的元素,每次調(diào)用__next__()方法都會(huì)返回下一個(gè)元素,如果沒(méi)有更多元素,則引發(fā)StopIteration異常。迭代器對(duì)象還可以在迭代過(guò)程中記錄迭代狀態(tài)。

每當(dāng)使用for循環(huán)來(lái)遍歷一個(gè)可迭代對(duì)象時(shí),Python會(huì)在內(nèi)部自動(dòng)創(chuàng)建一個(gè)迭代器對(duì)象,并調(diào)用其__next__()方法來(lái)逐個(gè)獲取元素。因此,可以說(shuō)for循環(huán)是基于迭代器工作的。

下面是一個(gè)示例,演示了可迭代對(duì)象和迭代器的概念:

fruits?=?['apple',?'banana',?'orange']

#?fruits是可迭代對(duì)象,可以在for循環(huán)中使用
for?fruit?in?fruits:
????print(fruit)

#?創(chuàng)建迭代器對(duì)象
iterator?=?iter(fruits)

#?調(diào)用迭代器的__next__()方法獲取下一個(gè)元素
print(next(iterator))??#?輸出:'apple'
print(next(iterator))??#?輸出:'banana'
print(next(iterator))??#?輸出:'orange'
print(next(iterator))??#?引發(fā)StopIteration異常

在上面的示例中,fruits是一個(gè)可迭代對(duì)象,我們可以直接在for循環(huán)中使用它來(lái)遍歷元素。同時(shí),我們也可以使用iter()函數(shù)手動(dòng)將可迭代對(duì)象轉(zhuǎn)換為迭代器對(duì)象,并使用next()函數(shù)來(lái)逐個(gè)獲取元素。當(dāng)所有元素都被訪問(wèn)完畢時(shí),繼續(xù)調(diào)用next()函數(shù)會(huì)引發(fā)StopIteration異常。

需要注意的是,迭代器是一種一次性的對(duì)象,即在迭代過(guò)程中,一旦迭代器返回了所有元素,它就會(huì)耗盡,無(wú)法再次使用。如果想重新遍歷可迭代對(duì)象,需要重新創(chuàng)建迭代器對(duì)象。

  • 一個(gè)iterable更像是一個(gè)數(shù)據(jù)的保存者,一個(gè)container,它是可以沒(méi)有狀態(tài)的,它可以完全不知道你這個(gè)iterator數(shù)到哪了,它需要有能力產(chǎn)生一個(gè)iterator。
  • iterator一定是有狀態(tài)的,但是它并不需要實(shí)現(xiàn)一個(gè)container,它當(dāng)然內(nèi)部肯定知道它代表這個(gè)iterable里面是什么數(shù)據(jù)。iterator必須要有__next__這個(gè)method。這個(gè)method保證它在被next作用的時(shí)候可以返回下一個(gè)iterable。

自定義一個(gè)可迭代對(duì)象和對(duì)應(yīng)的迭代器-鏈表

#!?-*-conding=:?UTF-8?-*-
#?2023/5/22?18:43

class?NodeIter:
????def?__init__(self,?node):
????????self.curr_node?=?node

????def?__next__(self):
????????if?self.curr_node?is?None:
????????????raise?StopIteration
????????node,?self.curr_node?=?self.curr_node,?self.curr_node.next

????????return?node


class?Node:
????def?__init__(self,?name):
????????self.name?=?name
????????self.next?=?None

????def?__iter__(self):
????????return?NodeIter(self)


node1?=?Node("node1")
node2?=?Node("node2")
node3?=?Node("node3")

node1.next?=?node2
node2.next?=?node3


if?__name__?==?'__main__':
????for?node?in?node1:
????????print(node.name)

如果我們想在for loop里面使用鏈表的話,那我們就要自己把鏈表變成一個(gè)iterable。

這段代碼演示了如何自定義一個(gè)可迭代對(duì)象和對(duì)應(yīng)的迭代器。

首先,我們定義了一個(gè)Node類,表示一個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)具有一個(gè)名稱和一個(gè)指向下一個(gè)節(jié)點(diǎn)的引用。Node類實(shí)現(xiàn)了__iter__()方法,該方法返回一個(gè)迭代器對(duì)象。

然后,我們定義了一個(gè)NodeIter類作為迭代器,它接收一個(gè)節(jié)點(diǎn)對(duì)象作為參數(shù),并在__init__()方法中初始化當(dāng)前節(jié)點(diǎn)。NodeIter類實(shí)現(xiàn)了__next__()方法,用于返回下一個(gè)節(jié)點(diǎn)。在每次調(diào)用__next__()方法時(shí),它會(huì)將當(dāng)前節(jié)點(diǎn)作為結(jié)果返回,并將當(dāng)前節(jié)點(diǎn)更新為下一個(gè)節(jié)點(diǎn)。當(dāng)沒(méi)有更多節(jié)點(diǎn)時(shí),拋出StopIteration異常。

最后,在if __name__ == '__main__':條件下,我們使用自定義的可迭代對(duì)象和迭代器進(jìn)行遍歷。通過(guò)for node in node1:的語(yǔ)法,會(huì)自動(dòng)調(diào)用node1對(duì)象的__iter__()方法獲取迭代器,并通過(guò)迭代器逐個(gè)獲取節(jié)點(diǎn),并打印節(jié)點(diǎn)的名稱。

運(yùn)行以上代碼,輸出結(jié)果為:

node1
node2
node3

這個(gè)示例展示了如何自定義可迭代對(duì)象和迭代器,并在for循環(huán)中使用它們實(shí)現(xiàn)自定義的迭代邏輯。

到此這篇關(guān)于Python中的迭代器你了解嗎的文章就介紹到這了,更多相關(guān)Python迭代器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python GUI編程(Tkinter) 創(chuàng)建子窗口及在窗口上用圖片繪圖實(shí)例

    python GUI編程(Tkinter) 創(chuàng)建子窗口及在窗口上用圖片繪圖實(shí)例

    這篇文章主要介紹了python GUI編程(Tkinter) 創(chuàng)建子窗口及在窗口上用圖片繪圖實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • Python+seaborn實(shí)現(xiàn)聯(lián)合分布圖的繪制

    Python+seaborn實(shí)現(xiàn)聯(lián)合分布圖的繪制

    聯(lián)合分布(Joint Distribution)圖是一種查看兩個(gè)或兩個(gè)以上變量之間兩兩相互關(guān)系的可視化圖,在數(shù)據(jù)分析操作中經(jīng)常需要用到。本文將通過(guò)seaborn實(shí)現(xiàn)繪制聯(lián)合分布圖,需要的可以參考一下
    2023-02-02
  • Python獲取時(shí)間戳的多種方法總結(jié)

    Python獲取時(shí)間戳的多種方法總結(jié)

    時(shí)間戳是一個(gè)表示日期和時(shí)間的數(shù)值,通常以秒為單位,在Python中,獲取時(shí)間戳是常見(jiàn)的任務(wù),用于記錄事件、計(jì)時(shí)操作、以及在各種應(yīng)用中跟蹤時(shí)間,本文將介紹多種獲取時(shí)間戳的方法,包括標(biāo)準(zhǔn)庫(kù)和第三方庫(kù)的方式,并提供示例代碼以幫助你更好地理解
    2023-11-11
  • Python中最強(qiáng)大的重試庫(kù)Tenacity使用探索

    Python中最強(qiáng)大的重試庫(kù)Tenacity使用探索

    這篇文章主要為大家介紹了Python中最強(qiáng)大的重試庫(kù)Tenacity使用探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 基于梯度爆炸的解決方法:clip gradient

    基于梯度爆炸的解決方法:clip gradient

    今天小編就為大家分享一篇基于梯度爆炸的解決方法:clip gradient,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • Python爬蟲爬取電影票房數(shù)據(jù)及圖表展示操作示例

    Python爬蟲爬取電影票房數(shù)據(jù)及圖表展示操作示例

    這篇文章主要介紹了Python爬蟲爬取電影票房數(shù)據(jù)及圖表展示操作,結(jié)合實(shí)例形式分析了Python爬蟲爬取、解析電影票房數(shù)據(jù)并進(jìn)行圖表展示操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2020-03-03
  • 使用Python實(shí)現(xiàn)圖片批量重命名工具

    使用Python實(shí)現(xiàn)圖片批量重命名工具

    這篇文章主要為大家介紹了一個(gè)基于Python開(kāi)發(fā)的圖形界面工具,用于批量重命名文件夾中的圖片文件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考下
    2025-04-04
  • Python自定義裝飾器原理與用法實(shí)例分析

    Python自定義裝飾器原理與用法實(shí)例分析

    這篇文章主要介紹了Python自定義裝飾器原理與用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python自定義裝飾器,帶參數(shù)的裝飾器等概念、原理、實(shí)現(xiàn)方法及相關(guān)使用技巧,需要的朋友可以參考下
    2018-07-07
  • Python實(shí)現(xiàn)清理重復(fù)文件功能的示例代碼

    Python實(shí)現(xiàn)清理重復(fù)文件功能的示例代碼

    在電腦上或多或少的存在一些重復(fù)文件,體積小的倒沒(méi)什么,如果體積大的就很占內(nèi)存了。本文用python制作了一個(gè)刪除重復(fù)文件的小工具,核心代碼很簡(jiǎn)單,希望對(duì)你有所幫助
    2022-07-07
  • 如何將numpy二維數(shù)組中的np.nan值替換為指定的值

    如何將numpy二維數(shù)組中的np.nan值替換為指定的值

    這篇文章主要介紹了將numpy二維數(shù)組中的np.nan值替換為指定的值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05

最新評(píng)論