Python - 枚舉:初學者指南
你好啊,未來的Python巫師們!今天,我們將踏上一段令人興奮的旅程,進入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,每個都關聯著一個值。
為什麼要使用枚舉?
- 可讀性:枚舉使你的代碼更具可讀性。你可以使用有意義的名字,而不是使用晦澀的數字。
- 類型安全:枚舉幫助防止錯誤,確保你只使用預定義的值。
- 組織:它們將相關的常量組織在一起,使你的代碼更有條理。
存取枚舉中的成員
現在我們已經創建了我們的枚舉,讓我們看看如何在代碼中使用它。
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