Итератор (Iterator)
Это один из поведенческих паттернов проектирования/, созданный для обхода коллекций и упрощения классов хранения данных, вынося реализацию (или разные реализации) обхода в другие классы.
# coding: utf-8 class IteratorBase(object): """Базовый класс итератора""" def first(self): """Возвращает первый элемент коллекции. Если элемента не существует возбуждается исключение IndexError.""" raise NotImplementedError() def last(self): """Возвращает последний элемент коллекции. Если элемента не существует возбуждается исключение IndexError.""" raise NotImplementedError() def next(self): """Возвращает следующий элемент коллекции""" raise NotImplementedError() def prev(self): """Возвращает предыдущий элемент коллекции""" raise NotImplementedError() def current_item(self): """Возвращает текущий элемент коллекции""" raise NotImplementedError() def is_done(self, index): """Возвращает истину если элемент с указанным индексом существует, иначе ложь""" raise NotImplementedError() def get_item(self, index): """Возвращает элемент коллекции с указанным индексом, иначе выбрасывает исключение IndexError""" raise NotImplementedError() class Iterator(IteratorBase): def __init__(self, list_=None): self._list = list_ or [] self._current = 0 def first(self): return self._list[0] def last(self): return self._list[-1] def current_item(self): return self._list[self._current] def is_done(self, index): last_index = len(self._list) - 1 return 0 <= index <= last_index def next(self): self._current += 1 if not self.is_done(self._current): self._current = 0 return self.current_item() def prev(self): self._current -= 1 if not self.is_done(self._current): self._current = len(self._list) - 1 return self.current_item() def get_item(self, index): if not self.is_done(index): raise IndexError('Нет элемента с индексом: %d' % index) return self._list[index] it = Iterator(['one', 'two', 'three', 'four', 'five']) print [it.prev() for i in range(5)] # ['five', 'four', 'three', 'two', 'one'] print [it.next() for i in range(5)] # ['two', 'three', 'four', 'five', 'one']