Python中的迭代器你了解嗎
for loop和迭代器
在Python中,for循環(huán)是一種常用的迭代結構,用于遍歷可迭代對象
中的元素。迭代器是一種特殊的對象,它實現(xiàn)了迭代協(xié)議,允許按照一定的順序逐個訪問元素。
for循環(huán)和迭代器之間存在密切的關系,實際上,for循環(huán)是基于迭代器工作的。當使用for循環(huán)遍歷可迭代對象時,Python會在內部自動創(chuàng)建一個迭代器對象,并使用該迭代器來逐個獲取元素,直到所有元素都被訪問完畢。
for loop
里面in后面那個東西必須是一個iterable
, 也就是必須是一個可迭代對象
。
下面是一個示例,演示了for循環(huán)和迭代器之間的關系:
fruits?=?['apple',?'banana',?'orange'] #?使用for循環(huán)遍歷列表元素 for?fruit?in?fruits: ????print(fruit) #?上述代碼等價于下面的迭代器方式 iterator?=?iter(fruits)??#?創(chuàng)建迭代器對象 while?True: ????try: ????????fruit?=?next(iterator)??#?獲取下一個元素 ????????print(fruit) ????except?StopIteration: ????????break
在上面的示例中,我們首先使用for循環(huán)遍歷了列表fruits
中的元素,打印出每個水果的名稱。然后,我們手動創(chuàng)建了一個迭代器對象iterator
,并使用next()
函數逐個獲取元素,直到遇到StopIteration
異常,表示所有元素都被訪問完畢。
可以看到,使用for循環(huán)可以簡化迭代過程,不需要顯式地創(chuàng)建迭代器對象和處理StopIteration
異常。Python的許多內置對象(如列表、元組、字典等)都是可迭代的,因此可以直接在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)
除了內置的可迭代對象,你還可以自定義迭代器類,實現(xiàn)自己的迭代邏輯。這樣,你就可以在for循環(huán)中使用自定義的迭代器來遍歷特定的數據結構或實現(xiàn)特定的迭代行為。
for loop
的背后核心是迭代器
和可迭代對象
。
迭代器和可迭代對象
https://docs.python.org/3/glossary.html
在Python中,可迭代對象和迭代器是兩個相關但不同的概念。
可迭代對象(Iterable)
是指實現(xiàn)了__iter__()
方法的對象,或者實現(xiàn)了__getitem__()
方法且可按照順序訪問的對象。這兩者都是為了保證它可以在iter這個函數的作用下返回一個iterator
??傻鷮ο罂梢员坏?,也就是可以在for循環(huán)中使用。常見的可迭代對象包括列表、元組、字符串、字典、集合等。
迭代器(Iterator)
是一種特殊的對象,它實現(xiàn)了迭代協(xié)議,具有__iter__()
和__next__()
方法。迭代器用于逐個返回可迭代對象中的元素,每次調用__next__()
方法都會返回下一個元素,如果沒有更多元素,則引發(fā)StopIteration
異常。迭代器對象還可以在迭代過程中記錄迭代狀態(tài)。
每當使用for循環(huán)來遍歷一個可迭代對象時,Python會在內部自動創(chuàng)建一個迭代器對象,并調用其__next__()
方法來逐個獲取元素。因此,可以說for循環(huán)是基于迭代器工作的。
下面是一個示例,演示了可迭代對象和迭代器的概念:
fruits?=?['apple',?'banana',?'orange'] #?fruits是可迭代對象,可以在for循環(huán)中使用 for?fruit?in?fruits: ????print(fruit) #?創(chuàng)建迭代器對象 iterator?=?iter(fruits) #?調用迭代器的__next__()方法獲取下一個元素 print(next(iterator))??#?輸出:'apple' print(next(iterator))??#?輸出:'banana' print(next(iterator))??#?輸出:'orange' print(next(iterator))??#?引發(fā)StopIteration異常
在上面的示例中,fruits
是一個可迭代對象,我們可以直接在for循環(huán)中使用它來遍歷元素。同時,我們也可以使用iter()
函數手動將可迭代對象轉換為迭代器對象,并使用next()
函數來逐個獲取元素。當所有元素都被訪問完畢時,繼續(xù)調用next()
函數會引發(fā)StopIteration
異常。
需要注意的是,迭代器是一種一次性的對象,即在迭代過程中,一旦迭代器返回了所有元素,它就會耗盡,無法再次使用。如果想重新遍歷可迭代對象,需要重新創(chuàng)建迭代器對象。
- 一個iterable更像是一個數據的保存者,一個container,它是可以沒有狀態(tài)的,它可以完全不知道你這個iterator數到哪了,它需要有能力產生一個iterator。
- iterator一定是有狀態(tài)的,但是它并不需要實現(xiàn)一個container,它當然內部肯定知道它代表這個iterable里面是什么數據。iterator必須要有
__next__
這個method。這個method保證它在被next作用的時候可以返回下一個iterable。
自定義一個可迭代對象和對應的迭代器-鏈表
#!?-*-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里面使用鏈表的話,那我們就要自己把鏈表變成一個iterable。
這段代碼演示了如何自定義一個可迭代對象和對應的迭代器。
首先,我們定義了一個Node
類,表示一個節(jié)點,每個節(jié)點具有一個名稱和一個指向下一個節(jié)點的引用。Node
類實現(xiàn)了__iter__()
方法,該方法返回一個迭代器對象。
然后,我們定義了一個NodeIter
類作為迭代器,它接收一個節(jié)點對象作為參數,并在__init__()
方法中初始化當前節(jié)點。NodeIter
類實現(xiàn)了__next__()
方法,用于返回下一個節(jié)點。在每次調用__next__()
方法時,它會將當前節(jié)點作為結果返回,并將當前節(jié)點更新為下一個節(jié)點。當沒有更多節(jié)點時,拋出StopIteration
異常。
最后,在if __name__ == '__main__':
條件下,我們使用自定義的可迭代對象和迭代器進行遍歷。通過for node in node1:
的語法,會自動調用node1
對象的__iter__()
方法獲取迭代器,并通過迭代器逐個獲取節(jié)點,并打印節(jié)點的名稱。
運行以上代碼,輸出結果為:
node1
node2
node3
這個示例展示了如何自定義可迭代對象和迭代器,并在for循環(huán)中使用它們實現(xiàn)自定義的迭代邏輯。
到此這篇關于Python中的迭代器你了解嗎的文章就介紹到這了,更多相關Python迭代器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python GUI編程(Tkinter) 創(chuàng)建子窗口及在窗口上用圖片繪圖實例
這篇文章主要介紹了python GUI編程(Tkinter) 創(chuàng)建子窗口及在窗口上用圖片繪圖實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Python+seaborn實現(xiàn)聯(lián)合分布圖的繪制
聯(lián)合分布(Joint Distribution)圖是一種查看兩個或兩個以上變量之間兩兩相互關系的可視化圖,在數據分析操作中經常需要用到。本文將通過seaborn實現(xiàn)繪制聯(lián)合分布圖,需要的可以參考一下2023-02-02