列挙型Enum
前回、for文やwhile文でループ(繰り返し)の先頭に戻るcontinueを紹介しました。
今回はPythonの列挙型enumの使い方を紹介します。
列挙型とはなんぞやということからですが、Python Docsによると「一意の値に紐付けられたシンボリックな名前の集合です」とのことです。
このままではよく分かりませんが、列挙型の名前の通り、「要素が列挙されていて、それぞれに特有の値がある型」と言えば少しは分かりやすくなったのではないでしょうか。
それでは始めていきましょう。
列挙型enumの基本的な使い方
まずは列挙型enumの基本的な使い方から見ていきましょう。
列挙型を作るには「enumモジュール」の「Enumクラス」をインポートします。
from enum import Enum
そして列挙型の定義を行います。
class Color(Enum):
Red = 0
Blue = 1
Green = 2
列挙型の定義はclassを使って「class 名前(Enum):」として、その次の行から要素(メンバーといいます)を記述します。
これであとは呼び出すだけですが、「Color.Red」で列挙型のメンバーである「Color.Red」が呼び出せます。
名前を取得したい場合はさらに「.name」、値を取得したい場合は「.value」で取得できます。
またメンバーの値を使って「Color(0)」とすると「Color.Red」が取得できます。
from enum import Enum
class Color(Enum):
Red = 0
Blue = 1
Green = 2
print(Color.Red)
print(Color.Red.name)
print(Color.Red.value)
print(Color(0))
実行結果
Color.Red
Red
1
Color.Red
もし順番に取得したい場合はfor文を使ってこんなふうに書くことができます。
from enum import Enum
class Color(Enum):
Red = 0
Blue = 1
Green = 2
for c in Color:
print(c)
実行結果
Color.Red
Color.Blue
Color.Green
またこんなふうに値から呼び出すこともできます。
from enum import Enum
class Color(Enum):
Red = 0
Blue = 1
Green = 2
print(len(Color))
for i in range(len(Color)):
print(Color(i))
実行結果
3
Color.Red
Color.Blue
Color.Green
IntEnum
次にメンバーの値が特定の値以上になったときに表示する様なプログラムを書いてみます。
その場合、「.value」を使ってこんなふうに書くことができます。
from enum import Enum
class Color(Enum):
Red = 0
Blue = 1
Green = 2
print(len(Color))
for i in range(len(Color)):
if i > Color.Red.value:
print(Color(i))
実行結果
3
Color.Blue
Color.Green
ここで「.value」をつけ忘れるとエラーとなります。
from enum import Enum
class Color(Enum):
Red = 0
Blue = 1
Green = 2
print(len(Color))
for i in range(len(Color)):
if i > Color.Red:
print(Color(i))
実行結果
3
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[15], line 11
8 print(len(Color))
10 for i in range(len(Color)):
---> 11 if i > Color.Red:
12 print(Color(i))
TypeError: '>' not supported between instances of 'int' and 'Color'
このようにEnumではその紐付けられた値を参照するには「.value」を使う必要があります。
ここでもう一つ「IntEnum」が出てきます。
使い方はほぼ「Enum」と同様ですが、こちらの場合は「.value」をつけなくても値が取得できるため、数値を比較するのに便利です。
from enum import IntEnum
class Color(IntEnum):
Red = 0
Blue = 1
Green = 2
print(len(Color))
for i in range(len(Color)):
if i > Color.Red:
print(Color(i))
実行結果
3
Color.Blue
Color.Green
値を自動でつけるauto間数
先ほどまではメンバーの値を自分でつけていました。
from enum import Enum
class Color(Enum):
Red = 0
Blue = 1
Green = 2
実は自分でつけなくても「auto()」とすると自動で値をつけてくれます。
ただし値は「1」から始まることに気をつけてください。
from enum import Enum, auto
class Color(Enum):
Red = auto()
Blue = auto()
Green = auto()
print(Color(1))
print(Color(2))
print(Color(3))
print(Color(0))
実行結果
Color.Red
Color.Blue
Color.Green
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[22], line 12
9 print(Color(2))
10 print(Color(3))
---> 12 print(Color(0))
(中略)
ValueError: 0 is not a valid Color
また最初の一つ目を手動で決めておき、あとは自動で決めてもらうなんてこともできます。
from enum import Enum, auto
class Color(Enum):
Red = 0
Blue = auto()
Green = auto()
print(Color(0))
print(Color(1))
print(Color(2))
実行結果
Color.Red
Color.Blue
Color.Green
また開始の値は「0」でなくても良く、その場合でも続きの番号を振ってくれます。
from enum import Enum, auto
class Color(Enum):
Red = 10
Blue = auto()
Green = auto()
print(Color(10))
print(Color(11))
print(Color(12))
実行結果
Color.Red
Color.Blue
Color.Green
次回はtry exceptで強制的に例外を発生させるraiseを紹介します。
ではでは今回はこんな感じで。
コメント