上篇文章我們對mpy標準微庫進行了簡單的方法羅列,又因為mpy是從標準的Python庫中退化而來,那就先簡單的學習一下Python的庫。

上面的文章說了這么多,那這篇就寫這些

我這里就用3.8寫了,使用jupyter環境
array是一個高效的數組模塊,該模塊定義了一個對象類型,它可以緊湊地表示一組基本值:字符、整數、浮點數。數組是序列類型,其行為與列表非常相似,只是其中存儲的對象類型受到限制。類型是在創建對象時使用類型代碼指定的, 類型代碼是單個字符。定義了以下類型代碼:

筆記,記好了
mpy中支持的格式代碼:b, B, h, H, i, I, l, L, q, Q, f, d(后 2 種取決于浮點支持)。
那這個和list有什么區別呢?首先是一種序列類型,序列方法都可以在上面使用。然后數組類型的對象是固定的,不可以混合裝載

使用要先導入,然后一開始要指定存儲的數據類型

后面用元組傳入存儲的東西

IDE可以智能的給出方法

這里使用了一個列表的轉換方法

這個比較簡單,實驗了mpy提供的一個添加方法
請看extend的方法
array.extend(iterable)
將來自 iterable 的項添加到數組末尾。如果 iterable 是另一個數組,它必須具有 完全 相同的類型碼;否則將引發 TypeError。如果 iterable 不是一個數組,則它必須為可迭代對象并且其元素必須為可添加到數組的適當類型。
限制較多,其實數據類型相同就行。其實方法這么少,正好可以去看看實現,誰說不是呢?

二進制之間的轉換方法,沒有什么說的

復數運算

這是完整的雙端隊列

mpy提供了兩個方法

我這里就做簡單的演示

這些方法mpy不支持而且很多方法是之后才加進來的
在看命名數組之前,需要知道一個概念,叫工廠函數:
工廠函數看上去有點像函數,實質上他們是類,當你調用它們時,實際上是生成了該類型的一個實例,就像工廠生產貨物一樣.
python核心編程
https://www.cr173.com/soft/10446.html書籍的下載位置

書籍封面

當然java里面也有這樣的概念,你可以看看

看這個,list這個函數本身就有工廠函數的能力
工廠函數是指這些內建函數都是類對象,當你調用它們的時候,實際上是創建了一個類實例,其實也可以理解成內建函數。
https://www.zhihu.com/question/20670869歸根結底,它源于設計模式中的一種說法,就是指你不通過類來直接構造對象,而是通過一個函數來構造對象,這樣允許你在函數中加入更多的控制。
懵了嗎?要是就這就懵了,那別看了~
其中命名元組賦予每個位置一個含義,提供可讀性和自文檔性。它們可以用于任何普通元組,并添加了通過名字獲取值的能力,通過索引值也是可以的。


我覺得你看例子就能看懂
其中有使用位置和關鍵字實參,可以像普通元組一樣去索引,字段可以用命去訪問,加入了__repr__的值方法。
在mpy里面是這樣使用的:
from collections import namedtupleMyTuple = namedtuple("MyTuple", ("id", "name"))t1 = MyTuple(1, "foo")t2 = MyTuple(2, "bar")print(t1.name)assert t2.name == t2[1]
命名元組實例沒有字典,所以它們要更輕量,并且占用更小內存。
我這個ordereddict真的不知道怎么翻譯了,反正就是可以迭代的時候(就是打印的時候可以按照你加進去的順序打印)
它會返回一個 dict 子類的實例,支持常用的 dict 方法。Ordered Dict 是一種記錄鍵首次插入順序的 dict 。如果新條目覆蓋現有條目,則原始插入位置保持不變。刪除一個條目并重新插入它將把它移到末尾。

這是標準Python庫
from collections import OrderedDictd = OrderedDict([("z", 1), ("a", 2)])# More items can be added as usuald["w"] = 5d["b"] = 3for k, v in d.items():print(k, v)
使用前記得初始化,以上為mpy
z 1a 2w 5b 3
輸出
接下來是文章中最有技術含量的東西,堆隊列算法,這個東西講起來就有學術味道了,而且還需要補充一些知識才可以。
容器:
在計算機科學中,容器是一個類或數據結構,其實例(運行實體)是其他對象的集合。換句話說,它們以遵循特定訪問規則的有組織的方式存儲對象。容器的大小取決于它包含的對象(元素)的數量。各種容器類型的底層(繼承)實現的大小和復雜性可能不同,并為任何給定場景選擇正確的實現提供了靈活性。
容器可以通過以下三個屬性來表征:
1.access,即訪問容器對象的方式。在數組的情況下,訪問是通過數組索引完成的。在堆棧的情況下,根據LIFO(后進先出)順序進行訪問,而在隊列的情況下,根據FIFO(先進先出)順序進行訪問;
2.storage,即容器對象的存儲方式;
3.traversal,即遍歷容器對象的方式。
容器類應該實現方法來執行以下操作:
1.創建一個空容器(構造函數);
2.將對象插入容器;
3.從容器中刪除對象;
4.刪除容器中的所有對象(清除);
5.訪問容器中的對象;
6.訪問容器中的對象數量(計數)。
7.容器有時與迭代器一起實現。
注意,容器其實是一種組織形式,就是特定的操作定義。它不單單是一種數據結構,它是一種更加高層的對數據結構的表達。
堆又是屬于隊列這種結構:
在計算機科學中,隊列是按序列維護的實體集合,可以通過在序列的一端添加實體和從序列的另一端刪除實體來修改。按照慣例,添加元素的序列末尾稱為隊列的后部、尾部或后部,刪除元素的末尾稱為隊列的頭部或前部,類似于以下使用的詞人們排隊等候商品或服務。
將元素添加到隊列尾部的操作稱為入隊,而從隊列中移除元素的操作稱為出隊。也可能允許其他操作,通常包括查看或前端操作,該操作返回下一個要出隊的元素的值而不將其出隊。
隊列的操作使其成為先進先出 (FIFO) 數據結構。在 FIFO 數據結構中,添加到隊列的第一個元素將是第一個被刪除的元素。這相當于要求一旦添加了新元素,必須先刪除之前添加的所有元素,然后才能刪除新元素。隊列是線性數據結構的一個例子,或者更抽象地說是一個順序集合。隊列在計算機程序中很常見,它們被實現為與訪問例程耦合的數據結構、抽象數據結構或在面向對象的語言中作為類。常見的實現是循環緩沖區和鏈表。
隊列在計算機科學、傳輸和運籌學領域提供服務,其中存儲和保存各種實體(如數據、對象、人員或事件)以供以后處理。在這些上下文中,隊列執行緩沖區的功能。隊列的另一個用途是實現廣度優先搜索。

大O表示

這個東西算是最出名的東西
那我們的堆是隊列中的優先級隊列:
在計算機科學中,優先級隊列是一種抽象數據類型,類似于常規隊列或堆棧數據結構,其中每個元素還具有與其關聯的“優先級”。在優先級隊列中,優先級高的元素在優先級低的元素之前被服務。在某些實現中,如果兩個元素具有相同的優先級,則根據它們入隊的順序為它們提供服務,而在其他實現中,具有相同優先級的元素的排序是不確定的。
雖然優先級隊列通常用堆實現,但它們在概念上與堆不同。優先級隊列是一個類似于“列表”或“地圖”的概念;正如列表可以用鏈表或數組實現一樣,優先隊列可以用堆或各種其他方法(例如無序數組)來實現。
上面這么多就夠了,這里只說一下。堆是一種稱為優先級隊列的抽象數據類型的最高效率實現,實際上,優先級隊列通常稱為“堆”,無論它們如何實現。在堆中,最高(或最低)優先級的元素總是存儲在根。但是,堆不是排序結構;它可以被認為是部分有序的。當需要重復刪除具有最高(或最低)優先級的對象時,堆是一種有用的數據結構。

一個圖解決戰斗,看節點的數字大小

只實現了這三個
這個模塊提供了堆隊列算法的實現,也稱為優先隊列算法。
堆是一個二叉樹,它的每個父節點的值都只會小于或大于所有孩子節點。它使用了數組來實現:從零開始計數,對于所有的 k ,都有``heap[k] <= heap[2*k+1]`` 和 heap[k] <= heap[2*k+2] 。為了便于比較,不存在的元素被認為是無限大。堆最有趣的特性在于最小的元素總是在根結點:heap[0] 。
這個API與教材中堆算法的實現不太一樣,在于兩方面:
(a)我們使用了基于零開始的索引。這使得節點和其孩子節點之間的索引關系不太直觀,但是由于Python使用了從零開始的索引,所以這樣做更加合適。
(b)我們的 pop 方法返回了最小的元素,而不是最大的
(這在教材中叫做 “最小堆”;而“最大堆”在課本中更加常見,因為它更加適用于原地排序)。
基于這兩方面,把堆看作原生的Python list也沒什么奇怪的: heap[0] 表示最小的元素,同時 heap.sort() 維護了堆的不變性!

注意堆的實現,是一個單獨的模塊

mpy中的堆操作,之后在使用的時候做說明