Это пользовательская реализация класса списка Python с именем «mylist». Класс использует библиотеку ctypes для создания массива C-типа с заданной емкостью, который используется для хранения элементов списка.
Класс имеет несколько методов, таких как init, __len__, append, pop, clear, find, insert, remove, __resize, __str__, __getitem__, __delitem__ и __make_array, которые имитируют функциональность встроенных методов списка Python.
class mylist: def __init__(self): self.size = 1 self.n = 0 # create a C type ka array with size -> self.size self.A = self.__make_array(self.size) def __len__(self): return self.n def append(self,item): # check if vacant if self.n == self.size: # array is full -> resize self.__resize(self.size*2) self.A[self.n] = item self.n = self.n + 1 def pop(self): if self.n == 0: return 'Empty List' print(self.A[self.n-1]) self.n = self.n - 1 def clear(self): self.n = 0 self.size = 1 def find(self,item): for i in range(self.n): if self.A[i] == item: return i return 'ValueError - not in list' def insert(self,pos,item): if self.n == self.size: self.__resize(self.size*2) for i in range(self.n,pos,-1): self.A[i] = self.A[i-1] self.A[pos] = item self.n = self.n + 1 def remove(self,item): # search and get pos pos = self.find(item) if type(pos) == int: # delete self.__delitem__(pos) else: return pos def __resize(self,new_capacity): # create a new array with new capacity B = self.__make_array(new_capacity) self.size = new_capacity # copy the content of old array to new one for i in range(self.n): B[i] = self.A[i] # reassign A self.A = B def __str__(self): result = '' for i in range(self.n): result = result + str(self.A[i]) + ',' return '[' + result[:-1] + ']' def __getitem__(self,index): if 0<= index < self.n: return self.A[index] else: return 'IndexError' def __delitem__(self,pos): # delete pos wala item if 0<= pos < self.n: for i in range(pos,self.n-1): self.A[i] = self.A[i+1] self.n = self.n - 1 def __make_array(self,capacity): # referential array(C type) return (capacity*ctypes.py_object)()
Метод ‘__init __’ или конструктор инициализирует класс и создает массив размером 1 и присваивает его переменной ‘self.A’.
def __init__(self): self.size = 1 self.n = 0 # create a C type ka array with size -> self.size self.A = self.__make_array(self.size)
Магический метод __len__ возвращает количество элементов в списке.
def __len__(self): return self.n
Метод «append» добавляет элемент в список, и, если список заполнен, он изменяет размер массива для размещения нового элемента.
def append(self,item): # check if vacant if self.n == self.size: # array is full -> resize self.__resize(self.size*2) self.A[self.n] = item self.n = self.n + 1
Метод pop удаляет последний элемент списка и печатает его.
def pop(self): if self.n == 0: return 'Empty List' print(self.A[self.n-1]) self.n = self.n - 1
Метод «очистить» устанавливает количество элементов в списке равным 0.
def clear(self): self.n = 0 self.size = 1
Метод find находит индекс элемента в списке.
def find(self,item): for i in range(self.n): if self.A[i] == item: return i return 'ValueError - not in list'
Метод «insert» вставляет элемент в определенную позицию в списке, и если список заполнен, он изменяет размер массива для размещения нового элемента.
def insert(self,pos,item): if self.n == self.size: self.__resize(self.size*2) for i in range(self.n,pos,-1): self.A[i] = self.A[i-1] self.A[pos] = item self.n = self.n + 1
Метод remove удаляет определенный элемент из списка.
def remove(self,item): # search and get pos pos = self.find(item) if type(pos) == int: # delete self.__delitem__(pos) else: return pos
Метод «__resize» изменяет размер массива до указанной новой емкости.
def __resize(self,new_capacity): # create a new array with new capacity B = self.__make_array(new_capacity) self.size = new_capacity # copy the content of old array to new one for i in range(self.n): B[i] = self.A[i] # reassign A self.A = B
Волшебный метод __str__ возвращает список в виде строки с элементами, разделенными запятыми и заключенными в квадратные скобки.
def __str__(self): result = '' for i in range(self.n): result = result + str(self.A[i]) + ',' return '[' + result[:-1] + ']'
Магический метод ‘__getitem__’ возвращает элемент по определенному индексу.
def __getitem__(self,index): if 0<= index < self.n: return self.A[index] else: return 'IndexError'
Магический метод ‘__delitem__’ удаляет элемент в определенной позиции.
def __delitem__(self,pos): # delete pos wala item if 0<= pos < self.n: for i in range(pos,self.n-1): self.A[i] = self.A[i+1] self.n = self.n - 1
Метод ‘__make_array’ создает массив C-типа с заданной емкостью и возвращает его.
def __make_array(self,capacity): # referential array(C type) return (capacity*ctypes.py_object)()
В целом, этот класс реализует базовую функциональность списка Python с использованием библиотеки ctypes, что позволяет лучше контролировать управление памятью и производительность.