1. 程式人生 > >Python學習:列舉型別

Python學習:列舉型別

一、Python中的列舉

Python中的列舉是作為一個類存在的,通常列舉類用來存放的同一狀態,同一維度下的變數。這是與其他語言的一個較為鮮明的特徵,總結它的用法特點如下:

  1. Python列舉作為一個類存在,使用它需要首先匯入列舉模組,然後繼承並自定義需要的列舉類;
  2. 匯入列舉模組可以是Enum(列舉值可以是任意型別),也可以是IntEnum(列舉值只能是整型);
  3. 列舉類不允許存在相同的標籤;但是允許不同標籤的列舉值相同,這樣後者相當於前者別名;
  4. 不同的列舉型別,即使列舉名和列舉值都一樣,比較結果也是False
  5. 列舉類的值不可以被外界更改

使用列舉類的情況:例如訂單狀態有1,2,3,但是你直接寫到程式碼裡order.status == 1這樣別人看你的程式碼看不懂的,不如你建立一個列舉類,將1和訂單未支付這兩個關聯上,如果是用dict的話方法每次都用get會比較麻煩,而且特性一少很多,並且dict裡邊value型別也不一定是理想的,很多不確定性吧

二、Python列舉的基本用法

定義一個列舉型別如下:

#第一步:匯入列舉類
from enum import Enum

#第二步:通過繼承的方式,定義一個適合我們使用的列舉類
#列舉的名字一般都大寫
#繼承Enum後列舉值可以是字串也可以是整型,如果IntEnum則必須整型
class PeopleStatus(Enum):
    Male = 0    
    Female = 1
    mood = "good"

1. 列印列舉資訊

#1.1列印列舉型別,得到的是一個列舉型別
print(PeopleStatus.Male)           #列印結果:<PeopleStatus.Male: 0>

#1.2列印列舉名,得到的是一個字串
print(PeopleStatus.Male.name)      #列印結果:'Male'
print(PeopleStatus.mood.name) #列印結果:'mood'

#1.3.列印列舉值
print(PeopleStatus.mood.value)     #列印結果:'good'

#1.4.測試列舉值不可更改,否則報錯
#PeopleStatus.mood = 'nb'       

#1.5.通過列舉名稱獲取列舉
PeopleStatus['mood']  列印結果:<PeopleStatus.mood: 'good'>

2. 遍歷列舉

#2.1.由於BLUE與BLUE_ALIAS列舉值相同,BLUE_ALIAS相當於BLUE的別名,所以沒有被打印出來
for value in PeopleStatus:
    print(value)

列印結果:
PeopleStatus.Male
PeopleStatus.Female
PeopleStatus.mood


#2.2.可以打印出所有的列舉值包括別名,使用__members__
for value in PeopleStatus.__members__:
    print(value)
    
列印結果:
Male
Female
mood

#2.3打印出列舉的所有資訊,得到是元組
for value in PeopleStatus.__members__.items():
    print(value)
 執行結果如下:
('Male', <PeopleStatus.Male: 0>)
('Female', <PeopleStatus.Female: 1>)
('mood', <PeopleStatus.mood: 'good'>)

3. 列舉的比較

#3.1兩個列舉值可以做等值比較
result1 = PeopleStatus.Female == PeopleStatus.Male
print(result1)    #列印false
result2 = PeopleStatus.mro == PeopleStatus.mood
print(result2)    #列印false

#3.2另一種比較
result2_1 = PeopleStatus.mro is PeopleStatus.mood
print(result2_1) #列印:false

#3.3兩個列舉值不支援大小比較
#result3 = PeopleStatus.Female > PeopleStatus.Male
#print(result3)   #列印:報錯

#3.4:列舉值和對應值比較,並不相等
result4 = PeopleStatus.Female == 1
print(result4)   #列印 False

4. 列舉別名

不同標籤但是列舉值相同,後者是前者別名

5. 列舉轉換

通過具體值得到列舉型別

num = 1
print(PeopleStatus(num))
#輸出:PeopleStatus.Female

三、列舉的特殊用法

建立一個列舉:列舉值只能是整型且不允許設定別名

from enum import IntEnum,unique
#列舉類的的特殊使用
@unique
class Grade(IntEnum):
    Heigh  = 1
    #Heigh_Alias = 2   #報錯重複值,設定unique後,不能設定別名
    medium = 2
    Low = 3 
    #Lower = "Lower"  #報錯,因為繼承IntEnum,所以列舉值只能是Int