码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2019-08-04 12:01:20      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:增加   ORC   返回   处理   类对象   也会   指定   and   裁剪   

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__接口的。

 
 
# -*- 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 =====================
a
a
title
a
title2
b
title3
c
>>> 

 

 

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

标签:增加   ORC   返回   处理   类对象   也会   指定   and   裁剪   

原文地址:https://www.cnblogs.com/kevin-red-heart/p/11297715.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!