迭代器(Iterator)與生成器( Generator)以及 for 循環刪除元素的一個坑!!!!!

迭代器(Iterator)與生成器( Generator) :


迭代器: 一個類方法中同時有iter方法和next方法,此時可以通過for循環遍歷該類對象.我們把這個類創建的實例對象稱爲可迭代對象 .
       使用for遍歷該類對象時, 會自動調用__iter__()方法,而__iter__()方法會返回一個定義了__next__()方法的迭代器對象,它在容器中逐個訪問容器內元素, next()也是 python的內置函數。在沒有後續元素時調用next()會拋出一個 StopIteration異常,遍歷停止.對於 strings、list、dict、tuple等這類容器對象,底層函數含有迭代器,於是可以直接使用 for循環遍歷。
       
生成器: 是創建迭代器的簡單而強大工具。它們寫起來就像是正規的函數,只在需要返回據時候使用 yield語句。每次 next()被調用時,生成器會返回它脫離的位置(記憶語句最後一次執行和所有數據 ,生成器會返回它脫離的位置)。


區別:生成器能做到迭代器的所有事,而且因爲自動創建了 __iter__()和 next()方法 ,生成器顯得特別簡潔 ,而且生成器也是高效的,使用生成器表達式取代列表解析可以同時節省 cup和內存。除了自動創建方法和保存程序狀態之外,當生成器終結時,還會自動拋出 StopIteration異常。Yield的用法有點像return,但是它返回的是一個生成器。


易踩坑點:使用iter()方法時經常會遇到ConcurrentModificationException異常,這通常是由於在使用Iter遍歷容器的同時又對容器做增加或刪除操作所導致的,由於遍歷時是按照索引執行的 ,刪除已經遍歷過的索引時,會導致後面的索引統一向前挪,舉個栗子:


解決方法: 先定義一個空列表來儲存要刪除的對象, 篩選一遍後  再進行刪除 .

C = [x for x in A if x =="C"or x == "D"]
for i in C:
    A.remove(i)
打印結果:
['C', 'D']
['A', 'B', 'E', 'F']


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章