一文帶你了解Python枚舉類enum的使用
簡(jiǎn)介
枚舉是與多個(gè)唯一常量綁定的一組符號(hào)
因?yàn)槊杜e表示的是常量,建議枚舉成員名用大寫
IntEnum 便于進(jìn)行系統(tǒng)交互
初試
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
print(Color.RED) # Color.RED
print(repr(Color.RED)) # <Color.RED: 1>
print(type(Color.RED)) # <enum 'Color'>
print(isinstance(Color.GREEN, Color)) # True
print(Color.RED.name) # RED
遍歷
from enum import Enum
class Shake(Enum):
VANILLA = 7
CHOCOLATE = 4
COOKIES = 9
MINT = 3
for shake in Shake:
print(shake)
# Shake.VANILLA
# Shake.CHOCOLATE
# Shake.COOKIES
# Shake.MINT
__members__ 列出 name 和成員
from enum import Enum
class Shape(Enum):
SQUARE = 2
DIAMOND = 1
CIRCLE = 3
ALIAS_FOR_SQUARE = 2
for name, member in Shape.__members__.items():
print(name, member)
# SQUARE Shape.SQUARE
# DIAMOND Shape.DIAMOND
# CIRCLE Shape.CIRCLE
# ALIAS_FOR_SQUARE Shape.SQUARE
可哈希
枚舉成員可哈希,可用于字典和集合
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
apples = {}
apples[Color.RED] = 'red delicious'
apples[Color.GREEN] = 'granny smith'
print(apples)
# {<Color.RED: 1>: 'red delicious', <Color.GREEN: 2>: 'granny smith'}
訪問成員
- name:變量名
- value:值
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
# 通過值訪問
print(Color(1)) # Color.RED
print(Color(3)) # Color.BLUE
# 通過name訪問
print(Color['RED']) # Color.RED
print(Color['GREEN']) # Color.GREEN
# 訪問成員的name或value
print(Color.RED.name) # RED
print(Color.RED.value) # 1
唯一枚舉值
裝飾器 @unique
from enum import Enum, unique
@unique
class Mistake(Enum):
ONE = 1
TWO = 2
THREE = 3
FOUR = 3
# ValueError: duplicate values found in <enum 'Mistake'>: FOUR -> THREE
自動(dòng)枚舉值
如果枚舉值不重要,可以用 auto(), 默認(rèn)從 1 開始
from enum import Enum, auto
class Color(Enum):
RED = auto()
BLUE = auto()
GREEN = auto()
print(Color(1)) # Color.RED
print(list(Color)) # [<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 3>]
比較運(yùn)算
- Enum 不支持直接排序
- IntEnum 可直接排序
Enum
from enum import Enum
class Color(Enum):
RED = 1
BLUE = 2
GREEN = 3
print(Color.RED is Color.RED) # True
print(Color.RED is Color.BLUE) # False
print(Color.RED is not Color.BLUE) # True
try:
Color.RED < Color.BLUE # Enum不支持直接排序
except Exception as e:
print(e) # '<' not supported between instances of 'Color' and 'Color'
print(Color.BLUE == Color.RED) # Fasle
print(Color.BLUE != Color.RED) # True
print(Color.BLUE == Color.BLUE) # True
print(Color.BLUE == 2) # False
IntEnum
from enum import IntEnum
class Color(IntEnum):
RED = 1
BLUE = 2
GREEN = 3
# IntEnum可直接排序
print(Color.RED < Color.BLUE) # True
print(Color.BLUE == 2) # True
功能性API
from enum import Enum
class Animal(Enum):
ANT = 1
BEE = 2
CAT = 3
DOG = 4
Animal = Enum('Animal', 'ANT BEE CAT DOG') # 同上
print(Animal) # <enum 'Animal'>
print(Animal.ANT) # <Animal.ANT: 1>
print(Animal.ANT.value) # 1
print(list(Animal)) # [<Animal.ANT: 1>, <Animal.BEE: 2>, <Animal.CAT: 3>, <Animal.DOG: 4>]
IntEnum
除了不可以直接和 Enum 比較,其他都類似整數(shù)
from enum import Enum, IntEnum
class Color(Enum):
RED = 1
GREEN = 2
class Shape(IntEnum):
CIRCLE = 1
SQUARE = 2
class Request(IntEnum):
POST = 1
GET = 2
print(Shape.CIRCLE == Color.RED) # False
print(Shape == 1) # False
print(Shape.CIRCLE == 1) # True
print(Shape.CIRCLE == Request.POST) # True
print(int(Shape.CIRCLE)) # 1
print(['a', 'b', 'c'][Shape.CIRCLE]) # b
print([i for i in range(Shape.SQUARE)]) # [0, 1]
IntFlag
類似 int,IntFlag 成員使用按位運(yùn)算符得到的結(jié)果仍然是 IntFlag 成員
IntFlag 和 Enum 的一個(gè)區(qū)別在于,如果沒有設(shè)置任何標(biāo)志(值為 0),則其布爾值為 False
from enum import IntFlag
class Perm(IntFlag):
R = 4 # 讀
W = 2 # 寫
X = 1 # 執(zhí)行
print(Perm.R | Perm.W) # <Perm.R|W: 6>
print(Perm.R + Perm.W) # 6
RW = Perm.R | Perm.W
print(Perm.R in RW) # True
from enum import IntFlag
class Perm(IntFlag):
R = 4 # 讀
W = 2 # 寫
X = 1 # 執(zhí)行
RWX = 7 # 讀寫執(zhí)行
print(Perm.RWX) # <Perm.RWX: 7>
print(~Perm.RWX) # <Perm.-8: -8>
print(Perm.R & Perm.X) # <Perm.0: 0>
print(bool(Perm.R & Perm.X)) # False
print(Perm.X | 8) # <Perm.8|X: 9>
Flag
- Flag 與 IntFlag 類似,成員可使用按位運(yùn)算符進(jìn)行組合,但不可與其他 Flag 或 int 組合
- 推薦用 auto() 作為值
from enum import Flag, auto
class Color(Flag):
BLACK = 0
RED = auto()
BLUE = auto()
GREEN = auto()
WHITE = RED | BLUE | GREEN
print(Color.RED & Color.GREEN) # <Color.0: 0>
print(bool(Color.RED & Color.GREEN)) # False
print(Color.WHITE) # <Color.WHITE: 7>
print(Color.BLACK) # <Color.BLACK: 0>
print(bool(Color.BLACK)) # False
知識(shí)點(diǎn)
不支持同名
以上就是一文帶你了解Python枚舉類enum的使用的詳細(xì)內(nèi)容,更多關(guān)于Python枚舉類enum的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python+flask編寫一個(gè)簡(jiǎn)單實(shí)用的自動(dòng)排班系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了如何基于Python+flask編寫一個(gè)簡(jiǎn)單實(shí)用的自動(dòng)排班系統(tǒng),文中的示例代碼講解詳細(xì),有需要的小伙伴可以了解下2025-03-03
django authenticate用戶身份認(rèn)證的項(xiàng)目實(shí)踐
Django的contrib.auth模塊中的authenticate()函數(shù)用于對(duì)用戶的憑據(jù)進(jìn)行身份驗(yàn)證,本文就來介紹一下django authenticate用戶身份認(rèn)證的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08
python完成FizzBuzzWhizz問題(拉勾網(wǎng)面試題)示例
這篇文章主要介紹了python完成FizzBuzzWhizz問題(拉勾網(wǎng)面試題)示例,需要的朋友可以參考下2014-05-05
OpenCV計(jì)算平均值cv::mean實(shí)例代碼
函數(shù)cv::mean計(jì)算數(shù)組元素的平均值M,每個(gè)通道都是獨(dú)立的,并返回這個(gè)平均值,這篇文章主要給大家介紹了關(guān)于OpenCV計(jì)算平均值cv::mean的相關(guān)資料,需要的朋友可以參考下2021-08-08

