什麼是python
迭代器呢?舉一個最簡單的例子:
list1 = ["pdudo","juejin","hello"] tuple1 = ("pdudo","juejin","hello") dict1 = {"name":"pdudo"} for i in list1: print(i) for i in tuple1: print(i) for i in dict1: print(i)
這就是python
迭代器,好了,講完了,手工。
是的,使用for...in
的方式,底層都是使用的是迭代器,你是不是之前寫的時候,從來沒有好奇過,為什麼遍歷不同的資料類型,都可以使用for...in
通用呢?
弟弟我也是一樣的,沒有想過,為什麼可以這樣寫。迭代器語法我們已經講了,接下來,我們來剝開迭代器的面紗吧。
只要符合python
迭代器條件的,都可以使用for...in
來遍歷元素,即: 使用相同的程式碼,遍歷不同的資料容器。 我認為這是根本原因。
如果上述描述還不清晰的話,我們可以使用c
和python
來遍歷一下數組 和 字串,就能清晰的了解了。
如上程式碼,是c
語言遍歷數組"pdudo","hello","juejin"
和字串pdudohellojuejin
,我們需要自己寫遍歷條件的臨界值。
而如何使用python
來寫呢?來看下呢。
list1 = ["pdudo","hello","juejin"] char1 = "pdudohellojuejin" for v in list1: print(v) for c in char1: print(c)
只需要定義數組和字串,而後使用for...in
便結束了。
我想,如上例子,就足以證明為什麼要使用迭代器的原因了,因為真的很酷。
在經歷了前2段的鋪墊,我猜你一定很想知道迭代器是如何運作的吧?現在它來了。
在使用for...in
語句時,它會呼叫inter()
對象,函數會傳回一個迭代器物件。該物件又定義了__next__()
方法,該方法一次傳回一個容器元素,當沒有更多元素可以回傳的時候,會拋一個StopIteration
異常來表示 for
終止迴圈。
是不是還是不懂?沒關係,我們再寫一個案例來說明。
list1 = ["pdudo","hello","juejin"] it = iter(list1) print(next(it)) print(next(it)) print(next(it)) print(next(it))
如上程式碼,定義了一個列表,其值為: "pdudo","hello","juejin",而後呼叫iter
方法,它將傳回一個迭代器,而後呼叫next
方法傳回下一個元素,但我們定義的列表長度為3,而呼叫了4次next
方法,可見,最後一次會拋異常。
我們執行後,效果如下:
可見,和我們上述猜想的一致,在for...in
語句中,也是呼叫inter()
容器對象,使用__next__
返回後續可迭代的對象,如此類推,直至遇到異常StopIteration
,循環結束。
好了,知道迭代器是如何運作了吧?那麼,我們再拋出一個問題,看你能否接住呢?如何判斷一個資料型別是能夠被迭代的呢?
我們已經學會如何使用迭代器,以及知曉了迭代器是如何運作的,本段落將介紹如何建立一個迭代器,在看這個之前,我們思考一個問題,如下程式碼是否會報錯?
a = 9527 for i in a: print(i)
我們使用for...in
來遍歷一個int
類型的資料。
如上程式碼,當然會報錯,藉此引出我們的知識點:什麼樣的資料型別才能被迭代呢?
是這樣的,能否被迭代,取決於該方法是否有__iter__
方法。
可以看下如下例子,我們自訂了一個迭代器,用於倒敘輸出資料。
#!/bin/env python class flashBack: def __init__(self,list1): self.data = list1 self.index = len(list1)-1 def __iter__(self): return self def __next__(self): if self.index < 0: raise StopIteration val = self.data[self.index] self.index = self.index - 1 return val def main(): list1 = [1,2,3,4,5] tuble1 = ("pdudo","juejin","hello") for i in flashBack(list1): print(i) for i in flashBack(tuble1): print(i) if __name__ == '__main__': main()
執行後,結果為:
可見,建立一個迭代器,至少需要__iter__
方法和有 __next__
方法。
好了,有了這個基礎案例,我們來寫一個鍊錶?
#!/bin/env python class Node: def __init__(self,val): self.val = val self.nextNode = None class Lists: def __init__(self,currentNodes): self.currentNode = currentNodes def __iter__(self): return self def __next__(self): if self.currentNode is None: raise StopIteration v = self.currentNode.val self.currentNode = self.currentNode.nextNode return v def main() : node1 = Node(1) node2 = Node(2) node3 = Node(3) node1.nextNode = node2 node2.nextNode = node3 for i in Lists(node1): print(i) if __name__ == '__main__': main()
如上程式碼,我們先建立節點Node
,它有2個值,val
是記錄的值,而nextNode
是記錄下一個Node
的指針,而後定義了類別Lists
,呼叫時候,需要傳入一個Node
,它會將currentNodes
來記錄目前的Node
重點看__next__
,噹噹前節點為空的時候,則回傳StopIteration
告知for
迭代器結束了,否則的話,取出目前節點的val
並且返回,且將其下滑到下一個節點。
如上程式碼,運行後,結果如下:
以上是Python中如何建立迭代器?的詳細內容。更多資訊請關注PHP中文網其他相關文章!