上篇文章我們對mpy標(biāo)準(zhǔn)微庫進行了簡單的方法羅列,又因為mpy是從標(biāo)準(zhǔn)的Python庫中退化而來,那就先簡單的學(xué)習(xí)一下Python的庫。 上面的文章說了這么多,那這篇就寫這些 我這里就用3.8寫了,使用jupyter環(huán)境 array是一個高效的數(shù)組模塊,該模塊定義了一個對象類型,它可以緊湊地表示一組基本值:字符、整數(shù)、浮點數(shù)。數(shù)組是序列類型,其行為與列表非常相似,只是其中存儲的對象類型受到限制。類型是在創(chuàng)建對象時使用類型代碼指定的, 類型代碼是單個字符。定義了以下類型代碼: 筆記,記好了 mpy中支持的格式代碼: 那這個和list有什么區(qū)別呢?首先是一種序列類型,序列方法都可以在上面使用。然后數(shù)組類型的對象是固定的,不可以混合裝載 使用要先導(dǎo)入,然后一開始要指定存儲的數(shù)據(jù)類型 后面用元組傳入存儲的東西 IDE可以智能的給出方法 這里使用了一個列表的轉(zhuǎn)換方法 這個比較簡單,實驗了mpy提供的一個添加方法 請看extend的方法
將來自 iterable 的項添加到數(shù)組末尾。如果 iterable 是另一個數(shù)組,它必須具有 完全 相同的類型碼;否則將引發(fā) 限制較多,其實數(shù)據(jù)類型相同就行。其實方法這么少,正好可以去看看實現(xiàn),誰說不是呢? 二進制之間的轉(zhuǎn)換方法,沒有什么說的 復(fù)數(shù)運算 這是完整的雙端隊列 mpy提供了兩個方法 我這里就做簡單的演示 這些方法mpy不支持而且很多方法是之后才加進來的 在看命名數(shù)組之前,需要知道一個概念,叫工廠函數(shù):
https://www.cr173.com/soft/10446.html 書籍的下載位置 書籍封面 當(dāng)然java里面也有這樣的概念,你可以看看 看這個,list這個函數(shù)本身就有工廠函數(shù)的能力 工廠函數(shù)是指這些內(nèi)建函數(shù)都是類對象,當(dāng)你調(diào)用它們的時候,實際上是創(chuàng)建了一個類實例,其實也可以理解成內(nèi)建函數(shù)。 https://www.zhihu.com/question/20670869 歸根結(jié)底,它源于設(shè)計模式中的一種說法,就是指你不通過類來直接構(gòu)造對象,而是通過一個函數(shù)來構(gòu)造對象,這樣允許你在函數(shù)中加入更多的控制。 懵了嗎?要是就這就懵了,那別看了~ 其中命名元組賦予每個位置一個含義,提供可讀性和自文檔性。它們可以用于任何普通元組,并添加了通過名字獲取值的能力,通過索引值也是可以的。 我覺得你看例子就能看懂 其中有使用位置和關(guān)鍵字實參,可以像普通元組一樣去索引,字段可以用命去訪問,加入了__repr__的值方法。 在mpy里面是這樣使用的: from collections import namedtuple
MyTuple = namedtuple("MyTuple", ("id", "name")) t1 = MyTuple(1, "foo") t2 = MyTuple(2, "bar") print(t1.name) assert t2.name == t2[1] 命名元組實例沒有字典,所以它們要更輕量,并且占用更小內(nèi)存。 我這個ordereddict真的不知道怎么翻譯了,反正就是可以迭代的時候(就是打印的時候可以按照你加進去的順序打印) 它會返回一個 dict 子類的實例,支持常用的 dict 方法。Ordered Dict 是一種記錄鍵首次插入順序的 dict 。如果新條目覆蓋現(xiàn)有條目,則原始插入位置保持不變。刪除一個條目并重新插入它將把它移到末尾。 這是標(biāo)準(zhǔn)Python庫 from collections import OrderedDict
d = OrderedDict([("z", 1), ("a", 2)]) # More items can be added as usual d["w"] = 5 d["b"] = 3 for k, v in d.items(): print(k, v) 使用前記得初始化,以上為mpy z 1 a 2 w 5 b 3 輸出 接下來是文章中最有技術(shù)含量的東西,堆隊列算法,這個東西講起來就有學(xué)術(shù)味道了,而且還需要補充一些知識才可以。 容器: 在計算機科學(xué)中,容器是一個類或數(shù)據(jù)結(jié)構(gòu),其實例(運行實體)是其他對象的集合。換句話說,它們以遵循特定訪問規(guī)則的有組織的方式存儲對象。容器的大小取決于它包含的對象(元素)的數(shù)量。各種容器類型的底層(繼承)實現(xiàn)的大小和復(fù)雜性可能不同,并為任何給定場景選擇正確的實現(xiàn)提供了靈活性。 容器可以通過以下三個屬性來表征: 1.access,即訪問容器對象的方式。在數(shù)組的情況下,訪問是通過數(shù)組索引完成的。在堆棧的情況下,根據(jù)LIFO(后進先出)順序進行訪問,而在隊列的情況下,根據(jù)FIFO(先進先出)順序進行訪問; 2.storage,即容器對象的存儲方式; 3.traversal,即遍歷容器對象的方式。 容器類應(yīng)該實現(xiàn)方法來執(zhí)行以下操作: 1.創(chuàng)建一個空容器(構(gòu)造函數(shù)); 2.將對象插入容器; 3.從容器中刪除對象; 4.刪除容器中的所有對象(清除); 5.訪問容器中的對象; 6.訪問容器中的對象數(shù)量(計數(shù))。 7.容器有時與迭代器一起實現(xiàn)。 注意,容器其實是一種組織形式,就是特定的操作定義。它不單單是一種數(shù)據(jù)結(jié)構(gòu),它是一種更加高層的對數(shù)據(jù)結(jié)構(gòu)的表達。 堆又是屬于隊列這種結(jié)構(gòu): 在計算機科學(xué)中,隊列是按序列維護的實體集合,可以通過在序列的一端添加實體和從序列的另一端刪除實體來修改。按照慣例,添加元素的序列末尾稱為隊列的后部、尾部或后部,刪除元素的末尾稱為隊列的頭部或前部,類似于以下使用的詞人們排隊等候商品或服務(wù)。 將元素添加到隊列尾部的操作稱為入隊,而從隊列中移除元素的操作稱為出隊。也可能允許其他操作,通常包括查看或前端操作,該操作返回下一個要出隊的元素的值而不將其出隊。 隊列的操作使其成為先進先出 (FIFO) 數(shù)據(jù)結(jié)構(gòu)。在 FIFO 數(shù)據(jù)結(jié)構(gòu)中,添加到隊列的第一個元素將是第一個被刪除的元素。這相當(dāng)于要求一旦添加了新元素,必須先刪除之前添加的所有元素,然后才能刪除新元素。隊列是線性數(shù)據(jù)結(jié)構(gòu)的一個例子,或者更抽象地說是一個順序集合。隊列在計算機程序中很常見,它們被實現(xiàn)為與訪問例程耦合的數(shù)據(jù)結(jié)構(gòu)、抽象數(shù)據(jù)結(jié)構(gòu)或在面向?qū)ο蟮恼Z言中作為類。常見的實現(xiàn)是循環(huán)緩沖區(qū)和鏈表。 隊列在計算機科學(xué)、傳輸和運籌學(xué)領(lǐng)域提供服務(wù),其中存儲和保存各種實體(如數(shù)據(jù)、對象、人員或事件)以供以后處理。在這些上下文中,隊列執(zhí)行緩沖區(qū)的功能。隊列的另一個用途是實現(xiàn)廣度優(yōu)先搜索。 大O表示 這個東西算是最出名的東西 那我們的堆是隊列中的優(yōu)先級隊列: 在計算機科學(xué)中,優(yōu)先級隊列是一種抽象數(shù)據(jù)類型,類似于常規(guī)隊列或堆棧數(shù)據(jù)結(jié)構(gòu),其中每個元素還具有與其關(guān)聯(lián)的“優(yōu)先級”。在優(yōu)先級隊列中,優(yōu)先級高的元素在優(yōu)先級低的元素之前被服務(wù)。在某些實現(xiàn)中,如果兩個元素具有相同的優(yōu)先級,則根據(jù)它們?nèi)腙牭捻樞驗樗鼈兲峁┓?wù),而在其他實現(xiàn)中,具有相同優(yōu)先級的元素的排序是不確定的。 雖然優(yōu)先級隊列通常用堆實現(xiàn),但它們在概念上與堆不同。優(yōu)先級隊列是一個類似于“列表”或“地圖”的概念;正如列表可以用鏈表或數(shù)組實現(xiàn)一樣,優(yōu)先隊列可以用堆或各種其他方法(例如無序數(shù)組)來實現(xiàn)。 上面這么多就夠了,這里只說一下。堆是一種稱為優(yōu)先級隊列的抽象數(shù)據(jù)類型的最高效率實現(xiàn),實際上,優(yōu)先級隊列通常稱為“堆”,無論它們?nèi)绾螌崿F(xiàn)。在堆中,最高(或最低)優(yōu)先級的元素總是存儲在根。但是,堆不是排序結(jié)構(gòu);它可以被認為是部分有序的。當(dāng)需要重復(fù)刪除具有最高(或最低)優(yōu)先級的對象時,堆是一種有用的數(shù)據(jù)結(jié)構(gòu)。 一個圖解決戰(zhàn)斗,看節(jié)點的數(shù)字大小 只實現(xiàn)了這三個 這個模塊提供了堆隊列算法的實現(xiàn),也稱為優(yōu)先隊列算法。 堆是一個二叉樹,它的每個父節(jié)點的值都只會小于或大于所有孩子節(jié)點。它使用了數(shù)組來實現(xiàn):從零開始計數(shù),對于所有的 k ,都有``heap[k] <= heap[2*k+1]`` 和 這個API與教材中堆算法的實現(xiàn)不太一樣,在于兩方面: (a)我們使用了基于零開始的索引。這使得節(jié)點和其孩子節(jié)點之間的索引關(guān)系不太直觀,但是由于Python使用了從零開始的索引,所以這樣做更加合適。 (b)我們的 pop 方法返回了最小的元素,而不是最大的 (這在教材中叫做 “最小堆”;而“最大堆”在課本中更加常見,因為它更加適用于原地排序)。 基于這兩方面,把堆看作原生的Python list也沒什么奇怪的: 注意堆的實現(xiàn),是一個單獨的模塊 mpy中的堆操作,之后在使用的時候做說明 |
|