python 的原生型別中並不包含列舉型別。為了提供更好的解決方案,python 通過在 3.4 版本中新增了enum
標準庫。 列舉型別可以看作是一種標籤或是一系列常量的集合,通常用於表示某些特定的有限集合。
列舉類可以方便地表示星期,月份等常數型別
,如果你不用列舉類,那麼你只能用數字或者字串。如果你使用數字,用1-7來表示星期數,但乙個數字在程式中不僅可以表示星期數,可能還有其他許多含義,這樣你在寫程式時就必須時刻記住這些數字的含義,這降低了程式的可讀性,也導致容易出錯
。而當你使用字串時,雖然沒有明顯的缺點,但在記憶體中字串所佔記憶體要比數字多,這就降低了程式的效率
。
列舉類正好彌補了這兩方面的缺點,你可以在**中使用列舉類,但在記憶體中存放時使用的是數字,既提高了可讀性,又提高了程式效率。更重要的是,python中的列舉型別是不可變型別,又可以進行迭代,這就意味著你可以隨時使用列舉型別而不用擔心改變了列舉型別的值。
簡單栗子:
# 匯入enum類
from
enum
import enum
class
fruit
(enum):=
1banana=2
orange=3
print
(fruit.
) # 輸出結果: fruit.
print
(repr
(fruit.
)) # 輸出結果:>
print
(type
(fruit.
)) # 輸出結果:<
enum
'fruit'
>
isinstance
(fruit.
, fruit) # 輸出結果:true
注意:列舉型別不可例項化,不可更改
定義列舉時,成員名不允許重複
class
fruit
(enum):=
1banana=2
banana=3
# 報錯資訊:typeerror: attempted to reuse key:
'banana'
成員值允許相同,第二個成員的名稱被視作第乙個成員的別名
class
fruit
(enum):=
1banbana=2
orange=1
print
(fruit.
) # 輸出結果:fruit.
print
(fruit.
orange
) # 輸出結果:fruit.
, 可以看出值相同,第二個成員名視作第乙個成員別名
print
(fruit.
orange
) # 輸出結果:true
print
(fruit(1
)) # 輸出結果:fruit.
若不能定義相同成員值,可以通過unique裝飾
from
enum
import enum, unique
@unique
class
fruit
(enum):=
1banana=2
orange=1
# 設定了相同的值,
# 就會報錯:valueerror: duplicate values found in
<
enum
'fruit'
>
:orange
->
通過成員名稱
來獲取成員:
print
(fruit[
]) # 輸出結果:fruit.
通過成員值
來獲取成員:
print
(fruit(1
)) # 輸出結果fruit.
成員的名稱屬性和值屬性
:
print
(fruit.
print
(fruit.
.value) # 輸出結果:1 ,獲取值的屬性
支援迭代方式遍歷成員,按定義的順序,如果有值重複的成員,僅獲取重複的第乙個成員:
for fruit in fruit:
print
(fruit)
# 輸出結果如下:
fruit.
fruit.
banana
fruit.
orange
特殊屬性__members__
是乙個將名稱對映到成員的有序字典,也可以通過它來完成遍歷:
for fruit in fruit.__members__.
items()
:print
(fruit)
# 輸出結果如下:(,
>)(
'banana'
,banana:2
>)(
'orange'
,orange:3
>
)
列舉的成員可以通過is
同一性比較或通過==
等值比較:
fruit.
orange # 輸出結果:false
fruit.
orange # 輸出結果:true
fruit.
== fruit.
orange # 輸出結果:false
fruit.
!= fruit.
orange # 輸出結果:true
列舉成員不能進行大小的比較:
fruit.
< fruit.
orange
# 輸出結果:
traceback
(most recent call last)
: file ""
, line 1,in
typeerror: unorderable types:
fruit()
<
fruit
()
intenum
是enum
的擴充套件,不同型別的整數列舉也可以相互比較:
from
enum
import intenum
class
fruit
(intenum):=
1banabna=2
print
(fruit.==1
) # 輸出結果:true
print
(fruit.
<
2) #輸出結果:true
成員值的型別,不可以設定非int型別:
class
fruit
(intenum):=
1banabna
="2"
orange=3
print
(fruit.
banana
)# 輸出結果如下:
traceback
(most recent call last)
: file ""
, line 1,in
file "d:\python35\lib\enum.py"
, line 268
,in __getattr__
raise attributeerror
(name)
from none
attributeerror:
banana
列舉型別詳解
一 列舉型別的定義 enum 型別名 型別名是變數名,指定列舉型別的名稱。列舉值表也叫列舉元素列表,列出定義的列舉型別的所有可用值,各個值之間用 分開。例 enum suit 二 列舉變數說明 列舉變數有多種宣告方式 1.列舉型別定義與變數宣告分開如 enum suit enum suit a en...
C C 列舉型別詳解
列舉型別 enumeration 是c 中的一種派生資料型別,它是由使用者定義的若干列舉常量的集合。定義格式 列舉型別的定義格式為 enum 型別名 其中 應用舉例 enum color set1 定義列舉型別color set1 enum week 定義列舉型別week 重要提示 定義列舉型別的主...
C 列舉型別詳解
列舉型可以隱式的轉換為int型 int型不能隱式的轉換為列舉型,int型必須強制轉換為列舉型。一 列舉型別的定義 enum 型別名 型別名是變數名,指定列舉型別的名稱。列舉值表也叫列舉元素列表,列出定義的列舉型別的所有可用值,各個值之間用 分開。例 enum suit 二 列舉變數說明 列舉變數有多...