Храните обычный список внутри класса и переводите внешний индекс i во внутренний i − 1. Явно отклоняйте нулевые и отрицательные индексы.
Список с индексацией, начинающейся с 1
Храните обычный список внутри класса и переводите внешний индекс i во внутренний i − 1. Явно отклоняйте нулевые и отрицательные индексы.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать класс MathList, который имитирует обычный список, но использует нумерацию элементов, стартующую с 1 вместо привычного 0. Экземпляр этого класса должен поддерживать добавление элементов через метод append, а также чтение и изменение значений по индексу, где первый элемент имеет индекс 1.
a = MathList()
a.append(1)
a.append(2)
assert a[1] == 1
assert a[2] == 2
a[2] = 3
assert a[2] == 3
Ответ
Храните обычный список внутри класса и переводите внешний индекс i во внутренний i − 1. Явно отклоняйте нулевые и отрицательные индексы.
class MathList:
def __init__(self):
self.items = []
def append(self, value):
self.items.append(value)
def _index(self, index):
if type(index) is not int:
raise TypeError('Нужен целый индекс')
if not 1 <= index <= len(self.items):
raise IndexError('Индекс вне диапазона')
return index - 1
def __getitem__(self, index):
return self.items[self._index(index)]
def __setitem__(self, index, value):
self.items[self._index(index)] = value
def __len__(self):
return len(self.items)
def __iter__(self):
return iter(self.items)
Отдельный __iter__ нужен, чтобы обход не пытался начать с индекса 0. Срезы здесь не поддерживаются: их семантику при нумерации с единицы следует определять отдельно.