全網最適合入門的物件導向程式設計教程:36 Python的內建資料型別-字典

FreakStudio發表於2024-08-14

全網最適合入門的物件導向程式設計教程:36 Python 的內建資料型別-字典

image

摘要:

字典是非常好用的容器,它可以用來直接將一個物件對映到另一個物件。一個擁有屬性的空物件在某種程度上說就是一個字典,屬性名對映到屬性值。在內部,物件透過字典來表示屬性,其值為屬性的值或物件的方法。

原文連結:

FreakStudio的部落格

往期推薦:

學嵌入式的你,還不會物件導向??!

全網最適合入門的物件導向程式設計教程:00 物件導向設計方法導論

全網最適合入門的物件導向程式設計教程:01 物件導向程式設計的基本概念

全網最適合入門的物件導向程式設計教程:02 類和物件的 Python 實現-使用 Python 建立類

全網最適合入門的物件導向程式設計教程:03 類和物件的 Python 實現-為自定義類新增屬性

全網最適合入門的物件導向程式設計教程:04 類和物件的Python實現-為自定義類新增方法

全網最適合入門的物件導向程式設計教程:05 類和物件的Python實現-PyCharm程式碼標籤

全網最適合入門的物件導向程式設計教程:06 類和物件的Python實現-自定義類的資料封裝

全網最適合入門的物件導向程式設計教程:07 類和物件的Python實現-型別註解

全網最適合入門的物件導向程式設計教程:08 類和物件的Python實現-@property裝飾器

全網最適合入門的物件導向程式設計教程:09 類和物件的Python實現-類之間的關係

全網最適合入門的物件導向程式設計教程:10 類和物件的Python實現-類的繼承和里氏替換原則

全網最適合入門的物件導向程式設計教程:11 類和物件的Python實現-子類呼叫父類方法

全網最適合入門的物件導向程式設計教程:12 類和物件的Python實現-Python使用logging模組輸出程式執行日誌

全網最適合入門的物件導向程式設計教程:13 類和物件的Python實現-視覺化閱讀程式碼神器Sourcetrail的安裝使用

全網最適合入門的物件導向程式設計教程:全網最適合入門的物件導向程式設計教程:14 類和物件的Python實現-類的靜態方法和類方法

全網最適合入門的物件導向程式設計教程:15 類和物件的 Python 實現-__slots__魔法方法

全網最適合入門的物件導向程式設計教程:16 類和物件的Python實現-多型、方法重寫與開閉原則

全網最適合入門的物件導向程式設計教程:17 類和物件的Python實現-鴨子型別與“file-like object“

全網最適合入門的物件導向程式設計教程:18 類和物件的Python實現-多重繼承與PyQtGraph串列埠資料繪製曲線圖

全網最適合入門的物件導向程式設計教程:19 類和物件的 Python 實現-使用 PyCharm 自動生成檔案註釋和函式註釋

全網最適合入門的物件導向程式設計教程:20 類和物件的Python實現-組合關係的實現與CSV檔案儲存

全網最適合入門的物件導向程式設計教程:21 類和物件的Python實現-多檔案的組織:模組module和包package

全網最適合入門的物件導向程式設計教程:22 類和物件的Python實現-異常和語法錯誤

全網最適合入門的物件導向程式設計教程:23 類和物件的Python實現-丟擲異常

全網最適合入門的物件導向程式設計教程:24 類和物件的Python實現-異常的捕獲與處理

全網最適合入門的物件導向程式設計教程:25 類和物件的Python實現-Python判斷輸入資料型別

全網最適合入門的物件導向程式設計教程:26 類和物件的Python實現-上下文管理器和with語句

全網最適合入門的物件導向程式設計教程:27 類和物件的Python實現-Python中異常層級與自定義異常類的實現

全網最適合入門的物件導向程式設計教程:28 類和物件的Python實現-Python程式設計原則、哲學和規範大彙總

全網最適合入門的物件導向程式設計教程:29 類和物件的Python實現-斷言與防禦性程式設計和help函式的使用

全網最適合入門的物件導向程式設計教程:30 Python的內建資料型別-object根類

全網最適合入門的物件導向程式設計教程:31 Python的內建資料型別-物件Object和型別Type

全網最適合入門的物件導向程式設計教程:32 Python的內建資料型別-類Class和例項Instance

全網最適合入門的物件導向程式設計教程:33 Python的內建資料型別-物件Object和型別Type的關係

全網最適合入門的物件導向程式設計教程:34 Python的內建資料型別-Python常用複合資料型別:元組和命名元組

全網最適合入門的物件導向程式設計教程:35 Python的內建資料型別-文件字串和__doc__屬性

更多精彩內容可看:

給你的 Python 加加速:一文速通 Python 平行計算

一文搞懂 CM3 微控制器除錯原理

肝了半個月,嵌入式技術棧大彙總出爐

電子計算機類比賽的“武林秘籍”

一個MicroPython的開源專案集錦:awesome-micropython,包含各個方面的Micropython工具庫

Avnet ZUBoard 1CG開發板—深度學習新選擇

文件和程式碼獲取:

可訪問如下連結進行對文件下載:

https://github.com/leezisheng/Doc

image

本文件主要介紹如何使用 Python 進行物件導向程式設計,需要讀者對 Python 語法和微控制器開發具有基本瞭解。相比其他講解 Python 物件導向程式設計的部落格或書籍而言,本文件更加詳細、側重於嵌入式上位機應用,以上位機和下位機的常見串列埠資料收發、資料處理、動態圖繪製等為應用例項,同時使用 Sourcetrail 程式碼軟體對程式碼進行視覺化閱讀便於讀者理解。

相關示例程式碼獲取連結如下:https://github.com/leezisheng/Python-OOP-Demo

正文

字典是非常好用的容器,它可以用來直接將一個物件對映到另一個物件。一個擁有屬性的空物件在某種程度上說就是一個字典,屬性名對映到屬性值。實際上,它們的關係比這更接近,在內部,物件透過字典來表示屬性,其值為屬性的值或物件的方法。甚至連模組的屬性也是以字典的形式儲存的。在如下程式碼中,我們訪問了 SensorClass 類的例項 s 的__dict__屬性和 FileIO 模組的__dict__屬性:

s = SensorClass()
    _# 訪問SensorClass類的__dict__屬性_
    print(SensorClass.__dict__)
    _# 訪問SensorClass類的例項s的__dict__屬性_
    print(s.__dict__)
    _# 訪問FileIO模組的__dict__屬性_
    print(FileIO.__dict__)

需要注意的是:用類名直接呼叫 dict,會輸出該由類中所有類屬性組成的字典;而使用類的例項物件呼叫 dict,會輸出由類中所有例項屬性組成的字典。

image

與序列是以連續的整數為索引不同的是,字典以關鍵字為索引,關鍵字可以是任意不可變型別,通常用字串或數值。從字典中查詢一個值是極高效的,因為某一鍵物件是直接對映到值上的。如果你想要透過一個物件找到另一個物件,那你應該用字典。儲存的物件被稱為值(value),作為索引的物件被稱為鍵(key)。

字典可以用 dict()建構函式或者{}語法來建立。構造字典時我們用冒號分隔鍵和值,用逗號分隔鍵/值對。例如,在定義 SensorClass 工作模式時,我們使用如下語句:

class SensorClass(SerialClass):
    _# 類變數:_
    _#   RESPOND_MODE -響應模式-0_
    _#   LOOP_MODE    -迴圈模式-1_
    RESPOND_MODE,LOOP_MODE = (0,1)

若使用字典建立,則如下所示:

class SensorClass(SerialClass):
    _# 類變數:_
    _#   RESPOND_MODE -響應模式-0_
    _#   LOOP_MODE    -迴圈模式-1_
    _# RESPOND_MODE,LOOP_MODE = (0,1)_
    _# 使用字典建立_
    WORK_MODE = {"RESPOND_MODE":0,"LOOP_MODE":1}

可以用方括號來查詢字典中某個鍵所對應的值:

def __init__(self,port:str = "COM11",id:int = 0,state:int = WORK_MODE["RESPOND_MODE"])

同時在訪問 SensorClass 的__dict__屬性時,我們可以看到 WORK_MODE 確實是為字典形式:

image

理解字典的最佳方式是把它看做無序的鍵值對集合。在同一個字典之內,關鍵字必須是互不相同。實際上,字典是物件,儘管它的主要用途是儲存其他物件。它們本身也有一些相關行為。最常用的方法之一就是 get 方法,它的第一個引數是鍵名,另一個可選的引數是當鍵名不存在時所返回的預設值:

# 訪問SensorClass.WORK_MODE中"RESPOND_MODE"鍵
    print(SensorClass.WORK_MODE.get("RESPOND_MODE"))
    # 訪問SensorClass.WORK_MODE中不存在的鍵,其中鍵名不存在時返回"NOT FOUND"
    print(SensorClass.WORK_MODE.get("RESET_MODE","NOT FOUND"))

下圖為執行結果:

image

為了進一步控制,可以用 setdefault 方法。如果鍵名存在於字典中,這個方法就和 get 一樣,返回這個鍵名所對應的值。反之,如果鍵名不存在,它不但會返回方法呼叫中提供的預設值(就像 get 方法一樣),還會將鍵名的值設定為這一預設值:

_# 訪問SensorClass.WORK_MODE中"RESPOND_MODE"鍵_
    print(SensorClass.WORK_MODE.setdefault("RESPOND_MODE"))
    _# 訪問SensorClass.WORK_MODE中不存在的鍵RESET_MODE_
    _# 如果RESET_MODE不存在,設定鍵值對:RESET_MODE-2_
    print(SensorClass.WORK_MODE.setdefault("RESET_MODE",2))
    _# 訪問上一行設定的SensorClass.WORK_MODE中"RESET_MODE"鍵_
    print(SensorClass.WORK_MODE.get("RESET_MODE"))

如下為執行結果:

image

另外 3 個有用的字典方法分別是 keys()、values()和 items()。前兩個分別返回字典中所有鍵名和值所組成的迭代器。如果想要處理這些鍵或值,可以像列表一樣或者用 for 迴圈語句。itmes()方法可能是最有效的,它返回的是(key, value)元組所組成的迭代器。配合元組解包功能,這個方法可以非常好地用在 for 迴圈中,來遍歷相應的鍵和值。如下示例程式碼列印了 SensorClass.WORK_MODE 字典中所有的鍵和值:

for mode, value in SensorClass.WORK_MODE.items():
        print("{} value is {}".format(mode, value))

image

需要注意的是,這些鍵值對並不是按照之前插入的順序列印出來的。為了提高查詢速度而用到的高效演算法(雜湊演算法),使得字典資料結構在本質上是無序的。****能夠計算雜湊值的物件可以透過特定的演算法將這個物件轉換成一個唯一的整數,用於快速查詢。這個雜湊值用於字典中的快速查值。例如,字串基於其中包含的字元對映到整數上,而元組透過組合其中的元素來計算雜湊值。任意兩個被認為是相同的物件(例如擁有相同字元的字串或值相同的元組)應該擁有相同的雜湊值,而且一個物件的雜湊值是永遠不會變的。然而,列表的內容是可變的,因此也會改變其雜湊值(兩個列表只有在所有內容完全相同時,才是相等的)。正因如此,列表不能用作字典鍵。同樣,字典也不能用作其他字典的鍵。與此不同的是,字典中的值對物件型別沒有任何限制。我們可以將字串鍵對映到一個列表值,或者可以在字典中巢狀別的字典。

雜湊值簡單地理解成是一段資料(某個檔案,或者是字串)的 DNA,或者身份證,它透過一定的雜湊演算法(典型的有 MD5,SHA-1 等),將一段較長的資料對映為較短小的資料,這段小資料就是大資料的雜湊值。他有這樣一個特點,他是唯一的,一旦大資料發生了變化,哪怕是個微小的變化,他的雜湊值也會發生變化。另外一方面,既然是 DNA,那就保證了沒有兩個資料的雜湊值是完全相同的。
具體詳解可以看:https://www.zhihu.com/question/21801702

image

相關文章