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

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

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

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

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

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

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

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


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

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

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

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

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

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