Demon:使用ctypes实现动态数组
-
使用面向对象程序设计方式实现列表的CRUD操作
类名:MyArray
成员:Python对象
操作:扩容及增加、修改、删除、查询元素
进阶:排序 -
注意:
- ctypes是Python自带的函数库,提供了一系列与C/C++语言兼容的数据结构类与方法,可以进行Python与C之间的数据交换与相互调用
- (5 * ctypes.py_object)()表示创建一个含有5个python对象作为元素的数组
-
代码
# @功能描述:实现动态数组
# @程序作者:一只萤火虫
import ctypes
class DynamicArray:
"""
自己实现的动态数组类
"""
def __init__(self, capacity=16):
"""
1、创建动态数组对象后,首先分配固定的空间大小(数组空间),默认16个元素空间
2、可以调用对象的方法添加元素,如果预留的空间大小不够了,那么允许扩容:*2
"""
self._length = 0 # 当前动态数组中的元素个数
self._capacity = capacity # 动态数组的初始化空间大小
# self._elements = None # 动态数组对象中,实际保存元素的结构(数组)
self._elements = self.___make_array(self._capacity)
def ___make_array(self, capacity):
""" 返回通过调用底层实现创建的动态空间 """
return (capacity * ctypes.py_object)()
def __getitem__(self, index):
if not 0 <= index < self._length:
# 如果数组下标错误,那么可以进行提示,也可以直接抛出异常
raise IndexError("数组下标越界!")
return self._elements[index]
def __setitem__(self, index, value):
if not 0 <= index < self._length:
raise IndexError("数组下标越界!")
self._elements[index] = value
def __resize(self, new_capacity):
""" 扩容方法 """
new_array = self.___make_array(new_capacity)
# 将原来空间的元素复制到新空间中
for i in range(self._length):
new_array[i] = self._elements[i]
del self._elements
# 记得更新容量大小
self._capacity = new_capacity
self._elements = new_array
def append(self, element):
""" 将传入的元素添加到内部数组的最后位置 """
if self._length == self._capacity:
self.__resize(self._capacity * 2)
self._elements[self._length] = element
self._length += 1
def find(self, element):
""" 查找传入元素的下标 """
for i in range(self._length):
if element == self._elements[i]:
return i
return -1
def remove(self, element):
""" 删除指定的元素 """
remove_index = self.find(element)
if remove_index == -1:
print("没有找到要删除的元素!")
return
# 如果找到了要删除的元素:后面一个元素赋值给前面一个元素
# 最后总长度-1
for i in range(remove_index, self._length - 1):
self._elements[i] = self._elements[i + 1]
self._length -= 1
def insert(self, index, element):
""" 在指定下标处插入元素 """
if not 0 <= index < self._length:
raise IndexError("插入的下标越界,无法进行插入操作!")
if self._length == self._capacity:
self.__resize(self._capacity * 2)
for i in range(self._length, index, -1):
self._elements[i] = self._elements[i - 1]
self._elements[index] = element
self._length += 1
def get_capacity(self):
return self._capacity
def __len__(self):
return self._length
def __str__(self):
contents = "【"
for i in range(self._length):
contents += str(self._elements[i]) + ", "
contents = contents[0:-2] + "】"
return contents
def sort(self):
for i in range(1, self._length):
curr_element = self._elements[i]
j = i - 1
while j >= 0 and self._elements[j] > curr_element:
self._elements[j + 1] = self._elements[j]
j -= 1
self._elements[j + 1] = curr_element
if __name__ == '__main__':
array1 = DynamicArray()
# array1[0] = 123 # 经过测试,不建议使用这种方式赋初值
# array1[2] = 456
# array1.append("abc")
# array1.append("def")
# array1[0] = "hello"
for i in range(33):
array1.append(i)
print(array1)
print("当前动态数组的容量:", array1.get_capacity(), "实际元素个数:", len(array1))
print("删除元素")
array1.remove(22)
print(array1)
print("插入元素:")
array1.insert(4, 9999)
print(array1)
print("排序:")
array1.sort()
print(array1)