__iter__と__next__を理解する

__iter____next__を理解するべく、rangeメソッドをRangeクラスで表現してみた。


class Range:
    def __init__(self,_min,_max,step=1):
    “””
    _min: 最小値
    _max:最大値
    step: ステップ数
    “””
        self._max = _max
        self.num = _min
        self.step = step

    def __iter__(self):
        return self

    def __next__(self):
        ret = self.num
        self.num += self.step
        if self.num > self._max:
            raise StopIteration
        return ret



for i in Range(10,100,10):
    print(i) #-> [10,20,30,40,50,60,70,80,90]
 

__iter____next__は手動で呼ぶこともできるのだけど、どちらもfor文を呼ぶと自動で呼ばれる。 __iter__とfor文の中で自動的に呼ばれるのに対して、__next__は毎回呼ばれる。__iter__で初期化を行って、__next__でその値に対して値を増加させる等の操作を行うようにすればよい。

応用して__iter__でファイルを開いて、__next__でファイルの特定の行数を取得して、raise StopIterationでファイルを閉じるとファイルの処理をfor文で書ける。


class Lines:
    """
    イテレータを使用して、Fileを開く
    """
    def __init__(self,filepath):
        self.filename = filepath

    def __iter__(self):
        """初期化"""
        self.idx = 0

        self._file = open(self.filename)
        self._file_body = [line for line in
                      self._file.read().split("\n") if len(line) is
                      not None]
        self.line_num = len(self._file_body)
        return self

    def __next__(self):
        if self.idx >= self.line_num:
            self._file.close()
            print("finished")
            raise StopIteration
        else:
            ret = self._file_body[self.idx]
            self.idx += 1
            return ret




for line in Lines("/Users/haradashinya/.vimrc"):
    print(line)
 

Related Contents

Pickup Contents