【Python基礎】列挙型enumの使い方

  • URLをコピーしました!
目次

列挙型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を紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次