关于可迭代对象、迭代器和生成器
可迭代:在Python中如果一個對象有__iter__( )方法或__getitem__( )方法,則稱這個對象是可迭代的(Iterable);其中__iter__( )方法的作用是讓對象可以用for ... in循環遍歷,__getitem__( )方法是讓對象可以通過“實例名[index]”的方式訪問實例中的元素。換句話說,兩個條件只要滿足一條,就可以說對象是可迭代的。顯然列表List、元組Tuple、字典Dictionary、字符串String等數據類型都是可迭代的。當然因為Python的“鴨子類型”,我們自定義的類中只要實現了__iter__( )方法或__getitem__( )方法,也是可迭代的。
迭代器:在Python中如果一個對象有__iter__( )方法和__next__( )方法,則稱這個對象是迭代器(Iterator);其中__iter__( )方法是讓對象可以用for ... in循環遍歷,__next__( )方法是讓對象可以通過next(實例名)訪問下一個元素。注意:這兩個方法必須同時具備,才能稱之為迭代器。列表List、元組Tuple、字典Dictionary、字符串String等數據類型雖然是可迭代的,但都不是迭代器,因為他們都沒有next( )方法。
上圖通過isinstance( )函數分別判斷列表、元組、字典、字符串是不是可迭代或迭代器。通過對定義的分析和比較我們得知:迭代器都是可迭代的,但可迭代的不一定是迭代器;可用for ... in循環的都是可迭代的,可用next( )遍歷的才是迭代器;next( )是單向的,一次只獲取一個元素,獲取到最后一個元素后停止;在可迭代的對象中提前存儲了所有的元素,而迭代器是惰性的,只有迭代到了某個元素,該元素才會生成,迭代之前元素可以是不存在的,迭代之后元素也可以被銷毀,因此迭代器在處理大量數據甚至無限數據時具有加載數據快、占用內存小等優勢。
生成迭代器的幾種方式
1.類中實現__iter__( )方法和__next__( )方法,歸功于Python的鴨子類型,我們只要在自定義的類中實現了這兩個方法,這個類的實例對象就是迭代器,不僅可以用for ... in循環,也可以用next( )遍歷。在__next__( )方法中必須對迭代進行檢查,超出范圍則觸發 StopIteration 異常。
2.iter( )函數,Python中的iter( object[, sentinel])函數可用來返回一個迭代器對象,iter( )函數只傳入一個參數時,參數必須為可迭代對象;當使用第二個參數sentinel(哨兵)時,第一個參數必須是一個可調用對象。
?
生成器(Generator)是創建迭代器的簡單而強大的工具
Python中提供的生成器:
1.生成器函數:常規函數定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回一個結果,在每個結果中間,掛起函數的狀態,以便下次重它離開的地方繼續執行
2.生成器表達式:類似于列表推導,但是,生成器返回按需產生結果的一個對象,而不是一次構建一個結果列表
?
轉載于:https://www.cnblogs.com/weidaijie/p/10517173.html
總結
以上是生活随笔為你收集整理的关于可迭代对象、迭代器和生成器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP 技能精进之 PHP-FPM 多进
- 下一篇: 运行错误:Application Err