日付の開始と終了から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