__iter__() の実装例、日付繰り返し

__iter__() イテレータの実装例

日付の開始と終了から1日ずつの datetime.date を返すイテレータ

class Datedayrange:
    import datetime
    def __init__(self, start_date: datetime.date, end_date: datetime.date):
        if start_date > end_date:
            raise ValueError('start_date > end_date')
        self.start_date = start_date
        self.end_date = end_date
    def __iter__(self):
        c_date = self.start_date
        while c_date <= self.end_date:
            yield c_date
            c_date += datetime.timedelta(days=1)

使用例

start = datetime.date(2024, 9, 27)
end = datetime.date(2024, 10, 3)
for d in Datedayrange(start, end):
    print(d)

結果

2024-09-27
2024-09-28
2024-09-29
2024-09-30
2024-10-01
2024-10-02
2024-10-03

__next__() を実装する方法、今回は以下より上の方がスマート
__iter__() が、__next()__ を実行してイテレート値を返すという意味で、
イテレート値を返さなくなったら、raise StopIteration で終了するようにする。

class Datedayrange:
    import datetime
    def __init__(self, start_date: datetime.date, end_date: datetime.date):
        if start_date > end_date:
            raise ValueError('start_date > end_date')
        self.start_date = start_date
        self.dt = end_date - start_date
        self.c = 0
    def __iter__(self):
        return self
    def __next__(self) -> datetime.date:
        if self.c <= self.dt.days:
            result = self.start_date + datetime.timedelta(days=self.c)
            self.c += 1
            return result
        else:
            raise StopIteration