2.ADT和類(抽象數據類型和麪向對象編程)

ADT:Abstrack Datatypepython


在python裏面一切都是對象
數據結構

示例:app

l = list()     #定義列表
l.append(3)    #調用append方法
l.remove(3)    #調用remove方法

上面示例中的列表就是一種抽象數據類型,經過組合一些現有的數據跟操做來造成一種新的數據結構。ide


用python的class實現抽象數據類型(ADT)函數


            data (數據)
測試

class對象

            method(操做方法)utf-8




這裏實現一個bag來作一個示例:rem


          data:要用容器去存儲
it

bag

          method:add、remove、len、iter


代碼以下:

#-*- condig:utf-8 -*-
class Bag(object):
    def __init__(self, maxsize=10):         #初始化,maxsize定義最大容量
        self.maxsize = maxsize              #屬性,表示最大容量
        self._items = list()                #容器類型,這裏用列表

    def add(self, item):                    #定義add操做
        if len(self) > self.maxsize:        #若是當前長度大於最大定義容量
            raise Exception ('Bag is Full') #拋出異常
        self._items.append(item)            #不然添加到列表中

    def remove(self, item):                 #定義刪除操做
        self._items.remove(item)

    def __len__(self):                      #魔術方法
        return len(self._items)             #數據列表的長度

    def __iter__(self):                     #實現迭代器
        for item in self._items:
            yield item

#測試用例
def test_bag():
    bag = Bag()
    bag.add(1)
    bag.add(2)
    bag.add(3)

    assert len(bag) == 3

    bag.remove(3)

    assert len(bag) == 2

    for i in bag:
        print (i)
#
#
test_bag()      #調用測試函數

執行腳本:

# python bag_adt.py


實現一個ADT要注意的幾個問題:

(1)數據成員,好比:items,應該選用什麼樣的數據結構?

(2)選用數據結構,可否知足定義ADT的操做要求?

         好比add,remove這些操做可否知足要求;

(3)選用數據結構能支持高效的操做,它的效率如何?

        例如上例中容器選用list來做爲他的底層存儲,實際上他的add和remove操做效率,

        不如選用set來做爲容器效率更高,上例中的 remove 的操做來刪除中間的一個元素,

        它的時間複雜度就是O(n)。

        【O(n)能夠簡單理解爲刪除一個元素,須要執行多少個步驟。】

相關文章
相關標籤/搜索