迭代器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 =====================
a
a
title
a
title2
b
title3
c
>>> 

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

时间: 2024-07-28 20:32:48

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

Python3基础 类的组合 把类的实例化放到一个新类里面

镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.------------------------------------------ code: class Girls: def __init__(self,num): self.num=num class OurClass: #组合,其他类的实例化,在这里类的实例化中进行 def __init__(self,boyNum,girlNum): self.boys=Boys

创建Car类,实例化并调用Car类计算运输的原料量是否足够

package dx; public class Car { //构造类 public Car() { System.out.println("Car的构造类"); } //构造类重用,初始化空车重量 public Car(double KongChe) { kongche = KongChe; } //成员变量 double kongche; //成员方法,计算货物重量 public double shizhong(double manzai) { return manzai - k

1.元类介绍/2.自定义元类控制类的行为/3.控制类的实例化行为/4.控制类的实例化行为的应用

1.元类介绍 1.储备知识exec()参数1;字符串形式得命令参数2.全局作用域(字典形式),如果不指定默认就使用globals()参数3.局部作用域(字典形式),如果不指定默认就使用locals() 2.python 一切皆对象 ,对象可以怎么用? 2.1. 都可以被引用 x=obj 2.2. 都可以当作函数得参数传入 2.3. 都可以当作函数得返回值 2.4. 都可以当作容器类得元素 li=[func,time] # 类也是对象,Foo=type() 类是属于type() 类 3.什么叫元类

Python3基础 把类的实例化放到另外一个类中

? python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 conda : 4.5.11 type setting : Markdown ? code """ @Author : 行初心 @Date : 18-9-23 @Blog : www.cnblogs.com/xingchuxin @GitHub : github.com/GratefulHeartCoder """ cl

自定义元类控制类的实例化行为

#只是储备 __call__方法:# class Foo:# def __call__(self, *args, **kwargs):# print(self)# print(args)# print(kwargs)# obj = Foo()# obj(1, 2, 3, a = 5, g = 8)'''在python中一切都是对象, 此地,Foo也是对象,Foo可以加括号调用,所以 obj也可以加括号调用但是obj这个对象的类的内部必须有__call__方法,此地可以引出, Foo的元类内部也有

[MVC学习笔记]1.项目结构搭建及单个类在各个层次中的实现

      新人刚开始学习ASP.NET MVC,若有不足之处希望能得到您的指点,不胜感激!        先来一张项目的层级结构图:       Model:模型层,主要是各种类型.枚举以及ORM框架,框架完成数据库和实体类的映射.项目中选用了微软的开源ORM框架 EntityFramework 6.0 (以下简称EF),数据库则选择了微软的轻量级数据库SQL Server Compact 4.0本地数据库(简称Compact),Compact对EF支持比较完美,又属于文档型数据库,部署起来比

【C/C++学院】0817-递归汉诺塔 双层递归 /CPP结构体 /面向过程与面向对象的编程模式/类的常识共用体实现一个类的特征/QT应用于类以及类的常识

递归汉诺塔 双层递归 #include <iostream> void han(int n, char A, char B, char C) { static int num = 1; std::cout << "第" << num << "次"; num++; if (n<1) { return; } else { han(n - 1, A, C, B); std::cout << A <&l

自定义MVC框架之工具类-模型类

截止目前已经改造了5个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 自定义MVC框架之工具类-图像处理类 这个模型类支持以下功能: >连贯操作,js叫链式操作,连贯操作的函数可以打乱顺序,最后一个函数必须是执行语句的那个函数,如select, delete, update, add等 如 $db->table( 'user' )->where( 'id=1' )->select() 等

【python类】类

1. 类的命名空间 1> 简单变量和属性名称 1. 简单变量名(无点号):遵循函数LEGB作用域法则 ==> 赋值(X = value):// 使变量成为本地变量:除非声明是全局的 ==> 引用(X):// LEGB搜索变量 2. 属性名称(点号属性名称):遵循模块和类的规则 ==> 赋值(object.X = value) // 实例对象命名空间内创建.修改变量 ==> 引用(object.X):// 基于类的对象:对象内遵循继承搜索:模块:对象中直接读取X(模块中存在类对