首頁 > 軟體

詳解Python中的列舉型別

2022-08-10 14:03:51

你好,我是 徵哥,今天分享一下 Python 中的列舉型別,為什麼需要列舉型別,及如何使用。

什麼是列舉型別

列舉(Enum)是一種資料型別,是繫結到唯一值的符號表示。您可以使用它來建立用於變數和屬性的常數集。它們類似於全域性變數,但是,它們提供了更有用的功能,例如分組和型別安全。Python 在 3.4 版本中新增了標準庫 enum。

為什麼要使用列舉

使用列舉有以下好處:

程式碼更容易閱讀,更容易維護。

減少由轉換或錯誤輸入引起的 bug。

使將來修改值變得更容易。

如何使用列舉

以我們最熟悉的性別為例,先建立一個列舉型別:

>>> from enum import Enum
>>> class Gender(Enum):
...     男 = 1
...     女 = 0
...     未知 = 2
...
>>> Gender
<enum 'Gender'>

存取列舉:

>>> for g in Gender:
...     print(g.name,g.value)
...
男 1
女 0
未知 2
>>> print(Gender.男.name)
男
>>> print(Gender.男.value)
1
>>> isinstance(Gender.男,Gender)
True
>>> Gender['男']
<Gender.男: 1>
>>> Gender['男'].value
1
>>> Gender['男'].name
'男'
>>> Gender(2).name
'未知'

接下來,讓我們先看看不使用列舉的版本,然後再看看使用列舉的版本,這樣就知道列舉的好處了。

以汽車銷售為例,我們需要根據不同國家的稅率來計算汽車的出售價格。不使用列舉的版本如下:

from dataclasses import dataclass

@dataclass
class Car:
    model: str
    price: float
    registraion_state: str

    def total_cost(self) -> float:
        match self.registraion_state:
            case "OR":
                return  self.price + (self.price * 0.05)
            case "WA":
                return  self.price + (self.price * 0.10)
            case "CA":
                return  self.price + (self.price * 0.08)
            case _:
                raise TypeError("Invalid registraion_state value")


car1 = Car(model="RAV4", price=30000, registraion_state="OR")
car2 = Car(model="RAV4", price=30000, registraion_state="WA")
car3 = Car(model="RAV4", price=30000, registraion_state="CA")
print(car1.total_cost())
print(car2.total_cost())
print(car3.total_cost())

程式碼共 26 行,用 3.10 版本執行結果如下:

31500.0
33000.0
32400.0

接下來,我們來看一看使用列舉版本的程式碼:

from dataclasses import dataclass

from enum import Enum

class StateTax(Enum):
    OR = 0.05
    WA = 0.10
    CA = 0.08

@dataclass
class Car:
    model: str
    price: float
    tax: StateTax

    def total_cost(self) -> float:
        return  self.price + (self.price * self.tax.value)       
    
    def get_tax(self):
        return self.tax.value


car1 = Car(model="RAV4", price=30000, tax=StateTax.OR)
car2 = Car(model="RAV4", price=30000, tax=StateTax.WA)
car3 = Car(model="RAV4", price=30000, tax=StateTax.CA)
print(car1.total_cost())
print(car2.total_cost())
print(car3.total_cost())

程式碼共 28 行,執行結果不變,但是程式碼更優雅,更容易閱讀了。而且後續增加出口的國家地區,也非常簡單,只需要增加一個列舉型別,建立一個新的 Car 物件,需求修改 Car 類的任何程式碼:

class StateTax(Enum):
    OR = 0.05
    WA = 0.10
    CA = 0.08
    CN = 0.03

car4 = Car(model="RAV4", price=30000, tax=StateTax.CN)

從字典建立列舉

from enum import Enum

tax = {
    'OR': 0.05,
    'WA': 0.10,
    'CA': 0.08,
    'CN': 0.03
}

StateTax = Enum('tax', tax)

存取列舉的三種方式:

print(StateTax['CN'])
print(StateTax.CN)
print(StateTax(0.03)) #通過 value 來存取

最後的話

列舉 (Enum) 是繫結到唯一值的符號。我們可以通過定義一個繼承自 Enum 的類來建立列舉,使用 enum[member_name] 通過名稱存取 Enum 成員,也可以通過並通過 enum(member_value) 存取,還可以通過 enum.member_name 來存取。Enum 可以幫助我們使程式碼更具可讀性,更具可維護性,推薦大家都用一用。

到此這篇關於詳解Python中的列舉型別的文章就介紹到這了,更多相關Python列舉型別內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com