Код на салфетке
25.08
Задача с классом MyList, на первый взгляд, кажется простой, но в ней скрыт небольшой подвох, связанный с работой метода getitem и поведением индексов. Верно ответили 17% из 29-ми человек. Самым популярным ответом с 49% голосов, оказался подвох с индексами. Давайте разберёмся.
Код задачи: `class MyList: def init(self, data): self.data = data
def getitem(self, index): value = self.data[index] if isinstance(value, list): return MyList(value) return value
def repr(self): return "Something"
lst = MyList([10, [20, 30], 40])
print(lst[0], lst[1], lst[1][1], lst[2][1])
Разбор задачи 1. Создаём класс MyList, принимающий в конструкторе список data и, сохраняющий его во внутренний атрибут self.data. 2. Dunder-метод getitem позволяет обращаться к элементам списка через экземпляры класса MyList. Он делает следующее: - Извлекает элемент по индексу. - Если элемент является списком, он оборачивает его в новый объект MyList. - Если элемент не список, он возвращается как есть. 3. Dunder-метод repr отвечает за строковое представление объекта и всегда возвращает строку "Something".
Далее создадим переменную lst с экземпляром класса MyList, передав ему список [10, [20, 30], 40].
Рассмотрим строку print(lst[0], lst[1], lst[1][1], lst[2][1]): 1. lst[0] — это доступ к первому элементу списка data, который равен 10. Так как это не список, метод возвращает 10. 2. lst[1] — это доступ ко второму элементу, [20, 30]. Этот элемент является списком, поэтому метод getitem возвращает новый экземпляр MyList, оборачивающий этот список. При выводе в print, для этого объекта вызывается метод repr, который возвращает "Something". 3. lst[1][1] — это доступ ко второму элементу списка [20, 30]. Но важно заметить, что lst[1] — это объект MyList. Поэтому вызов lst[1][1] сначала вызовет метод getitem у этого нового объекта, и вернёт 30, так как внутри у него хранится обычный список [20, 30]. 4. lst[2] — это доступ к третьему элементу списка data, который равен 40. Этот элемент — не список, а число. Однако в коде происходит попытка доступа ко второму элементу числа 40 с помощью индекса [1], что приведёт к ошибке, потому что у целого числа нет индексов.
Правильный ответ: 2. TypeError.
Почему возникает TypeError? Проблема кроется в выражении lst[2][1]. В списке [10, [20, 30], 40] третий элемент — это число 40, и попытка выполнить операцию индексирования с ним (доступ к элементу [1]) вызывает TypeError, так как индексы применимы только к коллекциям, но не к числам.
Таким образом, код приведёт к ошибке типа TypeError, что и является правильным ответом на задачу.`
еще контент в этом сообществе
еще контент в этом соообществе
Код на салфетке
25.08
войдите, чтобы увидеть
и подписаться на интересных профи