首頁  >  文章  >  後端開發  >  Python中如何建立迭代器?

Python中如何建立迭代器?

WBOY
WBOY轉載
2023-04-21 12:10:081305瀏覽

什麼是迭代器

什麼是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來遍歷元素,即: 使用相同的程式碼,遍歷不同的資料容器。 我認為這是根本原因。

如果上述描述還不清晰的話,我們可以使用cpython來遍歷一下數組 和 字串,就能清晰的了解了。

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方法,可見,最後一次會拋異常。

我們執行後,效果如下:

Python中如何建立迭代器?

可見,和我們上述猜想的一致,在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__ == &#39;__main__&#39;:
    main()

執行後,結果為:

Python中如何建立迭代器?

可見,建立一個迭代器,至少需要__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__ == &#39;__main__&#39;:
    main()

如上程式碼,我們先建立節點Node,它有2個值,val是記錄的值,而nextNode是記錄下一個Node的指針,而後定義了類別Lists,呼叫時候,需要傳入一個Node,它會將currentNodes來記錄目前的Node 重點看__next__,噹噹前節點為空的時候,則回傳StopIteration告知for迭代器結束了,否則的話,取出目前節點的val並且返回,且將其下滑到下一個節點。

如上程式碼,運行後,結果如下:

Python中如何建立迭代器?

以上是Python中如何建立迭代器?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除