Python的iterable、iterator、sequence

1、背景

   在工作中,我们往往需要定义自己的数据结构,能够使数据进行有效的读取、序列结构就是重要的数据结构之一,利用python中的list、tuple、str、dict等都是一些内置的序列结构,我们可以用len()函数返回序列长度或者for循环进行遍历元素,但实际上python的解释器会在实现这些功能自动调用数据类中的特殊方法,例如len()调用的就是__len__(),for循环调用的是__iter__(),实际上python中的特殊方法是非常强大,能够帮助我们有效的利用数据。

2、iterable、iterator、sequence

这里来说一说iterable和iterator、以及sequence的区别。

iterable实际上是一个类对象,任何包含__iter__()或者__getitem__()的方法的对象,都可以被认为是一个iterable。

sequence首先iterable的一种,顾名思义,sequence就是有有序的iterable,可以通过整数索引来访问其中的元素。因此在sequence中需要定义__len__()和__getitem__()方法。

iterator对象的实现必须满足迭代协议,python中这种迭代协议通过__next__()和__iter__()来实现。

(在hash类型数据中,__iter__()不能被__getitem__()代替。)

iterator用next()函数或者__next__()来访问元素,且每次访问iterator都会更新,能够更有效率的利用内存(访问完iterator就被清空了)。

这里放一个前面深度学习定义的数据序列:

import os
from torch import nn
from PIL import Image
import numpy as np

class Mydataset(nn.module):
    def __init__(self, images_dir:str,masks_dir:str, class_num:int, transform):
        super(Mydataset,self).__init__():
        self.class_num=class_num
        self.names=os.listdir(images_dir)
        self.images_fps=[os.path.join(images_dir,name) for name in self.names]
        self.masks_fps = [os.path.join(masks_dir, name.split(".")[0]+".npy") for name in self.names]
        self.transform=transform

    def __len__(self):
        return len(self.ids)

    def __getitem__(self, i):
        per_image=Image.open(self.images_fps[i])
        per_mask=np.load(self.masks_fps[i])
        per_mask[per_mask>self.class_num-1]=0
        per_image=self.transform(per_image)

        return per_image,per_mask

可以明显的看出这是一个sequence。

猜你喜欢

转载自blog.csdn.net/weixin_41803339/article/details/95757389
今日推荐