關於迭代器等概念參考:https://www.cnblogs.com/zf-blog/p/10613533.html
關於pytorch中的DataLoader類參考:https://blog.csdn.net/u014380165/article/details/79058479(寫的蠻好)
現在用一個例子來講解一下:
(1)法一:
a = torch.utils.data.DataLoader(....)
a = enumerate(a) #enumerate的built-in函數:__iter__()會將a變成iterator,后面可以再調用built-in函數:__next__()進行迭代;
m = a.__next__() #注意這里使用的是enumerate類型的built-in函數:__next__()
(2)法二:
a = torch.utils.data.DataLoader(...)
a = torch.utils.data.DataLoader.__iter__(a) #這里調用DataLoader的built-in函數:__iter__()將a變成iterator;
m = a.__next__() #注意:這里調用的是DataLoader的built-in函數:__next__()
PS:
(1)上述兩種__next__()得到的封裝結構是不同的,這個在拆解a時要注意;
(2)將容器(各種數據結構:list、tuple等)變成iterator時需要使用iter(),而對於類操作時需要在類中定義__init__()和__next__(),注意這點區別;(具體可參考:https://blog.csdn.net/admin_maxin/article/details/82052065 , 這樣也說明了為什么不能用a = iter() , m=a.next()這種做法,因為a是一個類了,需要用built-in函數__iter__將其變成iterator,再用__next__(),否則會報“enumarate” object has no attribute "next"的錯誤 or "DataLoader" object has no attribute "next")