搜尋
首頁後端開發Python教學Python中如何建立迭代器?

什麼是迭代器

什麼是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中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
Python腳本可能無法在UNIX上執行的一些常見原因是什麼?Python腳本可能無法在UNIX上執行的一些常見原因是什麼?Apr 28, 2025 am 12:18 AM

Python腳本在Unix系統上無法運行的原因包括:1)權限不足,使用chmod xyour_script.py賦予執行權限;2)Shebang行錯誤或缺失,應使用#!/usr/bin/envpython;3)環境變量設置不當,可打印os.environ調試;4)使用錯誤的Python版本,可在Shebang行或命令行指定版本;5)依賴問題,使用虛擬環境隔離依賴;6)語法錯誤,使用python-mpy_compileyour_script.py檢測。

舉一個場景的示例,其中使用Python數組比使用列表更合適。舉一個場景的示例,其中使用Python數組比使用列表更合適。Apr 28, 2025 am 12:15 AM

使用Python數組比列表更適合處理大量數值數據。 1)數組更節省內存,2)數組對數值運算更快,3)數組強制類型一致性,4)數組與C語言數組兼容,但在靈活性和便捷性上不如列表。

在Python中使用列表與數組的性能含義是什麼?在Python中使用列表與數組的性能含義是什麼?Apr 28, 2025 am 12:10 AM

列表列表更好的forflexibility andmixDatatatypes,何時出色的Sumerical Computitation sand larged數據集。 1)不可使用的列表xbilese xibility xibility xibility xibility xibility xibility xibility xibility xibility xibility xibles and comply offrequent elementChanges.2)

Numpy如何處理大型數組的內存管理?Numpy如何處理大型數組的內存管理?Apr 28, 2025 am 12:07 AM

numpymanagesmemoryforlargearraysefefticefticefipedlyuseviews,副本和內存模擬文件.1)viewsAllowSinglicingWithOutCopying,直接modifytheoriginalArray.2)copiesCanbecopy canbecreatedwitheDedwithTheceDwithThecevithThece()methodervingdata.3)metservingdata.3)memore memore-mappingfileShessandAstaStaStstbassbassbassbassbassbassbassbassbassbassbb

哪個需要導入模塊:列表或數組?哪個需要導入模塊:列表或數組?Apr 28, 2025 am 12:06 AM

Listsinpythondonotrequireimportingamodule,helilearraysfomthearraymoduledoneedanimport.1)列表列表,列表,多功能和canholdMixedDatatatepes.2)arraysaremoremoremoremoremoremoremoremoremoremoremoremoremoremoremoremoremeremeremeremericdatabuteffeftlessdatabutlessdatabutlessfiblesible suriplyElsilesteletselementEltecteSemeTemeSemeSemeSemeTypysemeTypysemeTysemeTypysemeTypepe。

可以在Python數組中存儲哪些數據類型?可以在Python數組中存儲哪些數據類型?Apr 27, 2025 am 12:11 AM

pythonlistscanStoryDatatepe,ArrayModulearRaysStoreOneType,and numpyArraySareSareAraysareSareAraysareSareComputations.1)列出sareversArversAtileButlessMemory-Felide.2)arraymoduleareareMogeMogeNareSaremogeNormogeNoreSoustAta.3)

如果您嘗試將錯誤的數據類型的值存儲在Python數組中,該怎麼辦?如果您嘗試將錯誤的數據類型的值存儲在Python數組中,該怎麼辦?Apr 27, 2025 am 12:10 AM

WhenyouattempttostoreavalueofthewrongdatatypeinaPythonarray,you'llencounteraTypeError.Thisisduetothearraymodule'sstricttypeenforcement,whichrequiresallelementstobeofthesametypeasspecifiedbythetypecode.Forperformancereasons,arraysaremoreefficientthanl

Python標準庫的哪一部分是:列表或數組?Python標準庫的哪一部分是:列表或數組?Apr 27, 2025 am 12:03 AM

pythonlistsarepartofthestAndArdLibrary,herilearRaysarenot.listsarebuilt-In,多功能,和Rused ForStoringCollections,而EasaraySaraySaraySaraysaraySaraySaraysaraySaraysarrayModuleandleandleandlesscommonlyusedDduetolimitedFunctionalityFunctionalityFunctionality。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。