迭代器iter(db),db为实例化的类对象,类对象中没有__iter__,但有__getitem__

def main(): import visdom import time viz = visdom.Visdom() db = Pokemon(pokeman, 224, train) x,y = next(iter(db)) ## print(sample:,x.shape,y.shape,y) viz.image(x,win=sample_x,opts=dict(title=sample_x))
##类class Pokemon(Dataset): def __init__(self): pass ##简写了 def __getitem__(self, idx): # idx~[0~len(images)] # self.images,self.labels # img :‘pokemon\\bulbasaur\\000000.png‘ # labels: 0 img, label = self.images[idx], self.labels[idx] tf = transforms.Compose([ lambda x: Image.open(x).convert(RGB), # string path=> image data transforms.Resize((self.resize, self.resize)), transforms.RandomRotation(15),##指定15度不至于造成难度太大,不收敛;同时增加了图片多样性 transforms.CenterCrop(self.resize),#中心裁剪,旋转后填充的黑部分,都会减掉 transforms.ToTensor(), transforms.Normalize(mean=[0.485,0.456,0.406], std = [0.229,0.224,0.225]) #归一化操作不想让数据在0-1,分布在0的右侧,想让数据围绕0左右分布, mean和std是imagenet统计出来的,以后就用这个就就行:RGB的均值和方差:mean=[0.485,0.456,0.406],std = [0.229,0.224,0.225] #但归一化后范围变为-1~1,图片会发生变化,整体数值向下进行了放缩和平移,因此需要做一个denomalize() ]) img = tf(img) label = torch.tensor(label) return img, label #这里只有关注img 和 label 是两个列表 

在这种情况下用到了iter(),但类中也没有__iter__,所以有点疑惑

 

查阅资料后发现

  当for发现没有__iter__但是有__getitem__的时候,会从0开始依次读取相应的下标,直到发生IndexError为止,这是一种旧的迭代协议。iter方法也会处理这种情况,在不存在__iter__的时候,返回一个下标迭代的iterator对象来代替。一个重要的例子是str,字符串就是没有__iter__接口的。

查阅资料:


链接:https://www.zhihu.com/question/44015086/answer/119281039  
https://www.cnblogs.com/MY0213/p/7884166.html  

# -*- coding: utf-8 -*-class Library(object): def __init__(self): self.books = { title : a, title2 : b, title3 : c, } def __getitem__(self, i): return self.books[i] # def __iter__(self): # 方法1 使用生成器 # for titles in self.books: # yield self.books[titles] # 方法2 使用迭代器# return self.books.itervalues() library = Library()# 1.普通方法print(library.books[1])# 2.使用__getitem__print(library[1])# 3.迭代器for book in library: print(book)

结果:

>>> ===================== RESTART: C:/Users/CUI/Desktop/1.py =====================aatitleatitle2btitle3c>>> 

 

 

相关文章