一文帶你了解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編寫個(gè)解釋器實(shí)現(xiàn)方法接受
計(jì)算機(jī)只能理解機(jī)器碼。歸根結(jié)底,編程語(yǔ)言只是一串文字,目的是為了讓人類更容易編寫他們想讓計(jì)算機(jī)做的事情。真正的魔法是由編譯器和解釋器完成,它們彌合了兩者之間的差距。解釋器逐行讀取代碼并將其轉(zhuǎn)換為機(jī)器碼2023-01-01python進(jìn)行二次方程式計(jì)算的實(shí)例講解
在本篇內(nèi)容里小編給大家整理了一篇關(guān)于python進(jìn)行二次方程式計(jì)算的實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2020-12-12python如何每天在指定時(shí)間段運(yùn)行程序及關(guān)閉程序
這篇文章主要介紹了python如何每天在指定時(shí)間段運(yùn)行程序及關(guān)閉程序問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2023-04-04分享python中matplotlib指定繪圖顏色的八種方式
這篇文章主要給大家分享的是python中matplotlib指定繪圖顏色的八種方式,在使用matplotlib的pyplot庫(kù)進(jìn)行繪圖時(shí),經(jīng)常會(huì)發(fā)現(xiàn)各種開源代碼指定“color”的方式并不一致,下面就向大家展示8種指定color的方式,需要的朋友可以參考一下2022-03-03Pycharm遠(yuǎn)程調(diào)試原理及具體配置詳解
這篇文章主要介紹了Pycharm遠(yuǎn)程調(diào)試原理及具體配置詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08python運(yùn)用sklearn實(shí)現(xiàn)KNN分類算法
這篇文章主要為大家詳細(xì)介紹了python運(yùn)用sklearn實(shí)現(xiàn)KNN分類算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10用Python監(jiān)控你的朋友都在瀏覽哪些網(wǎng)站?
今天教各位小伙伴一個(gè)黑科技,用Python監(jiān)控你的朋友都在瀏覽哪些網(wǎng)站,文中有非常詳細(xì)的介紹,對(duì)正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05pytest實(shí)戰(zhàn)技巧之參數(shù)化基本用法和多種方式
本文介紹了pytest參數(shù)化的基本用法和多種方式,幫助讀者更好地使用這個(gè)功能,同時(shí),還介紹了一些高級(jí)技巧,如動(dòng)態(tài)生成參數(shù)名稱、參數(shù)化的組合和動(dòng)態(tài)生成參數(shù)化裝飾器,幫助讀者更靈活地使用參數(shù)化,感興趣的朋友參考下吧2023-12-12