forked from pkolt/design_patterns
-
Notifications
You must be signed in to change notification settings - Fork 0
/
iterator.py
82 lines (61 loc) · 2.94 KB
/
iterator.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# coding: utf-8
"""
Итератор (Iterator) - паттерн поведения объектов.
Предоставляет способ последовательного доступа ко всем элементам составного объекта,
не раскрывая его внутреннего представления.
"""
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']