Python - 枚舉:初學者指南

你好啊,未來的Python巫師們!今天,我們將踏上一段令人興奮的旅程,進入Python中的枚舉(Enums)的世界。如果你以前從未聽說過枚舉,也別擔心——在這篇教程結束時,你將能像專家一樣使用它們!

Python - Enums

Python中的枚舉是什麼?

想象一下,你正在創建一個遊戲,玩家可以在不同的難度級別之間選擇。你可以使用簡單的字串或數字來表示這些級別,但如果你不小心理拼錯了一個級別或使用了無效的數字該怎麼辦?這就是枚舉出場救援的地方!

枚舉(Enum),是“enumeration”的簡稱,是一組不變的命名值。它就像一個特殊的預定義選項列表,你可以用在你的代碼中。讓我們深入到我們的第一個例子:

from enum import Enum

class DifficultyLevel(Enum):
EASY = 1
MEDIUM = 2
HARD = 3

在這段代碼中,我們從enum模塊中導入了Enum類。然後,我們創建了自己的Enum,名為DifficultyLevel。它有三個成員:EASY、MEDIUM和HARD,每個都關聯著一個值。

為什麼要使用枚舉?

  1. 可讀性:枚舉使你的代碼更具可讀性。你可以使用有意義的名字,而不是使用晦澀的數字。
  2. 類型安全:枚舉幫助防止錯誤,確保你只使用預定義的值。
  3. 組織:它們將相關的常量組織在一起,使你的代碼更有條理。

存取枚舉中的成員

現在我們已經創建了我們的枚舉,讓我們看看如何在代碼中使用它。

print(DifficultyLevel.EASY)        # 輸出:DifficultyLevel.EASY
print(DifficultyLevel.EASY.name)   # 輸出:EASY
print(DifficultyLevel.EASY.value)  # 輸出:1

# 比較枚舉成員
print(DifficultyLevel.EASY == DifficultyLevel.MEDIUM)  # 輸出:False
print(DifficultyLevel.HARD == DifficultyLevel.HARD)    # 輸出:True

讓我們來解釋一下:

  • 我們可以使用點表示法訪問枚舉成員。
  • .name屬性將給我們枚舉成員的名稱作為字串。
  • .value屬性將給我們關聯的值。
  • 我們可以使用==比較枚舉成員。

這裡有一個有趣的事實:枚舉成員是單例對象。這意味著無論你引用DifficultyLevel.EASY多少次,它始終是內存中相同的對象。這就像有一個永遠都在那裡支持你的最好的朋友!

迭代枚舉

枚舉最酷的事情之一是我們可以迭代它們。這在你想要對枚舉中的所有選項執行某些操作時非常有用。

for level in DifficultyLevel:
print(f"難度:{level.name}, 值:{level.value}")

# 輸出:
# 難度:EASY, 值:1
# 難度:MEDIUM, 值:2
# 難度:HARD, 值:3

這段代碼遍歷我們的DifficultyLevel枚舉的所有成員,打印出每個名稱和值。就像有一位神奇的導遊帶你參觀所有的選項!

高級枚舉功能

現在我們已經涵蓋了基礎,讓我們看看枚舉的一些更高级的功能。

自動編號

如果你不想手動分配值,Python可以為你做這件事:

from enum import Enum, auto

class Direction(Enum):
NORTH = auto()
SOUTH = auto()
EAST = auto()
WEST = auto()

print(list(Direction))  # 輸出:[<Direction.NORTH: 1>, <Direction.SOUTH: 2>, <Direction.EAST: 3>, <Direction.WEST: 4>]

auto()函數會自動分配從1開始的遞增整數值。

在函數中使用枚舉

枚舉對函數參數來說很棒。它們使你的函數更健壯且自描述:

def set_difficulty(level: DifficultyLevel):
print(f"遊戲難度設置為:{level.name}")

set_difficulty(DifficultyLevel.HARD)  # 輸出:遊戲難度設置為:HARD
set_difficulty("EASY")  # 這將引發TypeError

通過為level參數指定DifficultyLevel作為類型提示,我們告訴Python(以及其他開發人員)這個函數期望一個DifficultyLevel枚舉成員。

枚舉方法和屬性

以下是有用的枚舉方法和屬性的表格:

方法/屬性 描述 示例
Enum.name 返回枚舉成員的名稱 DifficultyLevel.EASY.name
Enum.value 返回枚舉成員的值 DifficultyLevel.EASY.value
Enum.__members__ 所有枚舉成員的字典 DifficultyLevel.__members__
Enum(value) 通過值獲取枚舉成員 DifficultyLevel(1)

結論

恭喜你!你剛剛通過掌握枚舉來提升你的Python技能。請記住,枚舉就像你編碼工具箱中的瑞士軍刀——它們可能看起來簡單,但非常多才多藝,可以使你的代碼更乾淨、更安全、更具可讀性。

下次你在項目中並發現自己在使用一組相關的常量時,考慮使用枚舉。你的未來自我(以及任何其他使用你代碼的開發人員)都會感謝你!

繼續編碼,繼續學習,並記住——在編程的世界中,每一天都是列舉你技能的機會!(懂了嗎?枚舉-列舉?好吧,我會自己出去的。?)

Credits: Image by storyset