參考鏈接: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)集合數據類型如list
、dict
、str
等是Iterable
但不是Iterator
,不過可以通過iter()
函數獲得一個Iterator
對象。
(4)第二類對象生成器都是Iterator;
(5)為什么list
、dict
、str
等數據類型不是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__();