zoukankan      html  css  js  c++  java
  • 数组

    Python中的数组

    我们这个选题将基于python去思考数组类型。

    python中内置的数组格式结构,我们经常用到的就是我们的列表,那么,我们就应该先熟悉,列表在底层,对空间的使用,和它的底层实现原理。

    list对空间的占用其实非常大,因为其底层的实现原理,其实可以从一个角度去理解这一点,insert通过对值的增加,因为中间插入,不确定下标,也许是最后一个值,直接占满空间,所以需要扩大一倍的空间,当然,对于这个的底层理解,我也没有过多的探究,只是从这个点去进行理解吧,apend和pop的理解也同理。当然,这不是我们今天内容的重点。

    了解了python中对数组格式的定义和利用后,我们就可以进一步的利用python去实现我们的数组类型,所以说python适合做算法人工智能,很大的一个优势就在于,它是一门伪代码语言,很容易实现我们所需要的逻辑。

    基础实现代码

    首先,我们为什么要继承object呢?因为python2中并不会直接继承object,如果这段代码在py2中运行,没有object的继承的话,则会报错,当然,在这里,这不是我们关注的重点,这作为一个了解的知识点学习就行了。

    array:数组(翻译中为:大堆)

    我们将python中的列表大小在一开始就确定好,这样的话,我们的set操作等,只需要对节点进行修改就可以了,因为我们的大小已经确定了,get也是如此,只需要通过下标去取值。这是我们对python中内置的魔法方法的重写完成的取值,下标赋值的操作。

    class Array(object):
        def __init__(self, size=32):
            self._size = size
            self._items = [None]*size
    
        def __getitem__(self, index):
            return self._items[index]
    
        def __setitem__(self, key, value):
            self._items[key] = value
    
        def __len__(self):
            return len(self._items)
    
        def clear(self, value=None):
            for index in self._items:
                self._items[index] = value
    
        def __iter__(self):
            for i in self._items:
                yield i

    当然,我们如何完成insert等进阶操作的编写呢?以及如何在超出范围的时候保证不会让我们的程序中断呢?下面我们将会对这些操作完成实现。

    数组进阶之append

    这里,我们通过对最后一个节点的记录,完成对append的编写,我们只需要在最后一次添加值的后面一个节点进行更改,就完成了我们的append,但是这里我们循环,仍然会打印None节点,同时有崩坏程序的危险。

    class Array(object):
        def __init__(self, size=32):
            self._size = size
            self._items = [None]*size
            self._last_node_index = -1
    
        def __getitem__(self, index):
            return self._items[index]
    
        def __setitem__(self, key, value):
            self._last_node_index = key
            self._items[key] = value
            
        def apend(self,value):
            self.__setitem__(self._last_node_index,value)
    
        def __len__(self):
            return len(self._items)
    
        def clear(self, value=None):
            for index in self._items:
                self._items[index] = value
    
        def __iter__(self):
            for i in self._items:
                yield i

    完成了上述代码后,我们只需要进行简单的对None节点的不取用,以及对空间超出时候的动态扩容就可以了。

    class Array(object):
        def __init__(self, size=32):
            self._size = size
            self._items = [None]*size
            self._last_node_index = -1
    
        def __getitem__(self, index):
            return self._items[index]
    
        def __setitem__(self, key, value):
            if key>self._size:
                self._size=2*self._size
                new_item=[None]*self._size
                for i,v in self._items:
                    new_item[i]=v
                self._items=new_item
            self._items[key] = value
            if key>self._last_node_index:
                self._last_node_index=key
    
        def apend(self,value):
            self.__setitem__(self._last_node_index+1,value)
    
        def __len__(self):
            return len(self._items)
    
        def clear(self, value=None):
            for index in self._items:
                self._items[index] = value
    
        def __iter__(self):
            for i in self._items:
                yield i
  • 相关阅读:
    如何看Linux服务器的load average
    java中File读取文件中文乱码
    LR代理录制
    虚拟机打开虚拟文件报不兼容,无法使用
    面向对象示例-注册登录例子
    pickle 模块
    item方法
    加密方法
    @classmethod 和 @staticmethod 用法
    python 中 @property 的用法
  • 原文地址:https://www.cnblogs.com/xuxingping/p/11441519.html
Copyright © 2011-2022 走看看