python中的Iterable對象和Iterator


參考鏈接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143178254193589df9c612d2449618ea460e7a672a366000?tdsourcetag=s_pcqq_aiomsg

可使用for進行迭代的數據類型分為以下兩種:

(1)集合數據類型:如dict、list、tuple、set、str等;

(2)generator:包括生成器和yield 的generator function;

注意:

(1)凡是可作用於for循環的對象都是Iterable類型;

(2)凡是可作用於next()函數的對象都是Iterator類型,它們表示一個惰性計算的序列;

(3)集合數據類型如listdictstr等是Iterable但不是Iterator,不過可以通過iter()函數獲得一個Iterator對象。

(4)第二類對象生成器都是Iterator;

(5)為什么listdictstr等數據類型不是Iterator

答:這是因為Python的Iterator對象表示的是一個數據流,Iterator對象可以被next()函數調用並不斷返回下一個數據,直到沒有數據時拋出StopIteration錯誤。可以把這個數據流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函數實現按需計算下一個數據,所以Iterator的計算是惰性的,只有在需要返回下一個數據時它才會計算()。Iterator甚至可以表示一個無限大的數據流,例如全體自然數。而使用list是永遠不可能存儲全體自然數的。

(6)

(這么說,for對第一類Iterable對象操作時,其實也是先將其變成Iterator,再調用next()函數,iter(A)將A變成iterator時會調用A.__iterator__())

PS:pytorch中使用torch.utils.data.DataLoader創建的對象是一個接口對象,無法使用

延伸:

(1)range和xrange的使用區別:range返回的是一個list,會直接放在內存里(比較占內存);而xrange返回的是一個iterable對象,每次迭代調用next()傳入一個單位數據到內存中(更有助於節約內存);

(2)關於yield關鍵字:在函數中使用yield時,它會將函數變成一個generator;用for迭代這個generator function時,yield所在位置相當於一個斷點,每次都執行完這個斷點,下一次迭代再接着運行剩下的部分再直接到下一次斷點,功能相當於print;(1)和(2)可參考:http://www.runoob.com/w3cnote/python-yield-used-analysis.html

(3)python3相對於python2,已不再使用next()方法,改為__next__()方法,iter()也改為了__iter__();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM