枚舉的作用簡述:
枚舉本身的意思就是一一列舉出來,在python及其它語言中,枚舉就是將該類型變量的所有可能取的值事先一一列舉出來,然后限制該變量在實際使用中就只能在這些值的范圍內取值。
使用枚舉類有哪些好處
枚舉類可以方便地表示星期,月份等常數類型,如果你不用枚舉類,那么你只能用數字或者字符串。如果你使用數字,用1-7來表示星期數,但一個數字在程序中不僅可以表示星期數,可能還有其他許多含義,這樣你在寫程序時就必須時刻記住這些數字的含義,這降低了程序的可讀性,也導致容易出錯。而當你使用字符串時,雖然沒有明顯的缺點,但在內存中字符串所占內存要比數字多,這就降低了程序的效率。
枚舉類正好彌補了這兩方面的缺點,你可以在代碼中使用枚舉類,但在內存中存放時使用的是數字,既提高了可讀性,又提高了程序效率。更重要的是,Python中的枚舉類型是不可變類型,又可以進行迭代,這就意味著你可以隨時使用枚舉類型而不用擔心改變了枚舉類型的值。
枚舉適用的python版本
enum 標準模塊在 3.4 版本才可以使用,3.3以下版本需要獨立安裝:https://pypi.python.org/pypi/enum34#downloads,官方說明:
enum34 is the new Python stdlib enum module available in Python 3.4
backported for previous versions of Python from 2.4 to 3.3. tested on
2.6, 2.7, and 3.3+
枚舉模塊的使用
首先,定義枚舉要導入enum模塊。
枚舉定義用class關鍵字,繼承Enum類。
示例代碼:
from
enum
import
Enum
class
Color
(
Enum
)
:
red
=
1
orange
=
2
yellow
=
3
green
=
4
blue
=
5
indigo
=
6
purple
=
7
print
(
type
(
Color
.
red
)
)
#
每個成員的數據類型就是它所屬的枚舉
代碼分析:
上面的代碼,我們定義了顏色的枚舉類Color.它有7個成員,分別是Color.red、Color.orange、Color.yellow等。
每一個成員都有它們各自名稱和值,Color.red成員的名稱是:red,值是:1。
每個成員的數據類型就是它所屬的枚舉。【*注:用class定義的類,實際上就是一種類型】
1.1 定義枚舉時,成員名稱不允許重復
from
enum
import
Enum
class
Color
(
Enum
)
:
red
=
1
red
=
2
上面的代碼,就無法執行。提示錯誤:TypeError: Attempted to reuse key: ‘red’
1.2 默認情況下,不同的成員值允許相同。但是兩個相同值的成員,第二個成員的名稱被視作第一個成員的別名
from
enum
import
Enum
class
Color
(
Enum
)
:
red
=
1
red_alias
=
1
成員Color.red和Color.red_alias具有相同的值,那么成員Color.red_alias的名稱red_alias就被視作成員Color.red名稱red的別名。
1.3 如果枚舉中存在相同值的成員,在通過值獲取枚舉成員時,只能獲取到第一個成員
from
enum
import
Enum
class
Color
(
Enum
)
:
red
=
1
red_alias
=
1
print
(
Color
(
1
)
)
輸出結果為:Color.red
1.4 如果要限制定義枚舉時,不能定義相同值的成員。可以使用裝飾器@unique【需要導入unique模塊】
from
enum
import
Enum
,
unique
@unique
class
Color
(
Enum
)
:
red
=
1
red_alias
=
1
再執行就會提示錯誤:ValueError: duplicate values found in
2. 枚舉取值
2.1 通過成員的名稱來獲取成員
Color
[
'red'
]
#Color.red
或
Color
.
red
#Color.red
2.2 通過成員值來獲取成員(第一個取該值的成員)
Color
(
1
)
#Color.red
2.3 通過成員,來獲取它的名稱和值
print
(
Color
.
red
.
name
)
#red
print
(
Color
(
1
)
.
name
)
#red
print
(
Color
.
red
.
value
)
#1
print
(
Color
(
1
)
.
value
)
#1
3. 迭代器
3.1 枚舉支持迭代器,可以遍歷枚舉成員
for
color
in
Color
:
print
(
color
)
輸出結果是,枚舉的所有成員。
Color
.
red
Color
.
orange
Color
.
yellow
Color
.
green
Color
.
blue
Color
.
indigo
Color
.
purple
Process finished
with
exit code
0
3.2 如果枚舉有值重復的成員,循環遍歷枚舉時只獲取值重復成員的第一個成員
from
enum
import
Enum
class
Color
(
Enum
)
:
red
=
1
orange
=
2
yellow
=
3
green
=
4
blue
=
5
indigo
=
6
purple
=
7
red_alias
=
1
for
color
in
Color
:
print
(
color
)
輸出結果是:Color.red、Color.orange、Color.yellow、Color.green、Color.blue、Color.indigo、Color.purple。但是Color.red_alias并沒有出現在輸出結果中。
3.3 如果想把值重復的成員也遍歷出來,要用枚舉的一個特殊屬性
__members__
from
enum
import
Enum
class
Color
(
Enum
)
:
red
=
1
orange
=
2
yellow
=
3
green
=
4
blue
=
5
indigo
=
6
purple
=
7
red_alias
=
1
for
color
in
Color
.
__members__
.
items
(
)
:
print
(
color
)
輸出結果:(‘red’,
4. 枚舉比較
4.1 枚舉成員可進行同一性比較
Color.red is Color.red
輸出結果是:True
Color.red is not Color.blue
輸出結果是:True
4.2 枚舉成員可進等值比較
Color.blue == Color.red
輸出結果是:False
Color.blue != Color.red
輸出結果是:True
4.3 枚舉成員不能進行大小比較
Color.red < Color.blue
輸出結果出錯:TypeError: unorderable types: Color() < Color()
別人寫的例子:
from
enum
import
Enum
,
unique
@unique
class
Weekday
(
Enum
)
:
Sun
=
0
Mon
=
1
Tue
=
2
Wed
=
3
Thu
=
4
Fri
=
5
Sat
=
6
day1
=
Weekday
.
Mon
print
(
'day1 ='
,
day1
)
print
(
'Weekday.Tue ='
,
Weekday
.
Tue
)
print
(
'Weekday[\'Tue\'] ='
,
Weekday
[
'Tue'
]
)
print
(
'Weekday.Tue.value ='
,
Weekday
.
Tue
.
value
)
print
(
'day1 == Weekday.Mon ?'
,
day1
==
Weekday
.
Mon
)
print
(
'day1 == Weekday.Tue ?'
,
day1
==
Weekday
.
Tue
)
print
(
'day1 == Weekday(1) ?'
,
day1
==
Weekday
(
1
)
)
for
name
,
member
in
Weekday
.
__members__
.
items
(
)
:
print
(
name
,
'=>'
,
member
)
Month
=
Enum
(
'Month'
,
(
'Jan'
,
'Feb'
,
'Mar'
,
'Apr'
,
'May'
,
'Jun'
,
'Jul'
,
'Aug'
,
'Sep'
,
'Oct'
,
'Nov'
,
'Dec'
)
)
for
name
,
member
in
Month
.
__members__
.
items
(
)
:
print
(
name
,
'=>'
,
member
,
','
,
member
.
value
)
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
