Categories: Python

【Python】switch文がないので何かで代用しよう!

この記事では、Pythonでswitch文を代用する方法を紹介します。

実はPythonには、switch文がありません。なので、switch文のような処理をしたい場合にはPythonに用意されているもの(機能)で工夫して代用するしかありません。

それでは、Pythonでswitch文を代用する方法を見ていきましょう!

Python 3.10からswitch文のように処理を分岐させれる構造パターンマッチングが追加されました。詳しくは以下の記事を参照してください。

構造パターンマッチングについて

switch文とは?

switch文とは、条件分岐をするための制御構文の1つです。

例として他の言語のswitch文の定義を見てみましょう。以下のコードは C#のswitch文の定義ですが、どの言語も大体こんな感じで定義されます。

switch(変数)
{
    case 値1:
        //変数の値 == 値1の時に実行される
        なんらかの処理
        break; 
    case 値2:
        //変数の値 == 値2の時に実行される
        なんらかの処理
        break; 
          ・
          ・
          ・ 
    default:
        //変数の値がどの値とも異なる時に実行される
        なんらかの処理
        break; 
}

このように、switch文を使うことで見やすく条件分岐を書くことができ、多分岐の場合には、if文よりも早く処理をすることができました。

しかし、Pythonには用意されていないので他の構文で代用するしかありません。

Pythonにswitch文がない理由

そもそもなぜPythonにはswitch文が用意されていないのでしょうか...?

Pythonにswitch文が実装されていない理由として公式ドキュメントには以下のように記載されています。

if... elif... elif... else の繰り返しで簡単に同じことができます。switch 文の構文に関する提案がいくつかありましたが、範囲判定をするべきか、あるいはどのようにするべきかについての合意は (まだ) 得られていません。
Python に switch や case 文がないのはなぜですか? - デザインと歴史 FAQ — Python 3.9.1 ドキュメント

つまりはいろいろ案はあったけど、とりあえず他の構文で代用できるので今のところは必要ないってことですね。

もちろん、将来的に追加される可能性は十分にあります。

switch文の代用方法

それでは、他の構文を使ってswitch文を代用する方法を見ていきましょう!

if文で代用する

公式ドキュメントに記述されていたようにif… elif… elif… elseを使うことでswitch文のように扱うことができます。

v = 2

if v == 1:
    print(1)
elif v == 2 or v == 3:
    print('2 or 3')
elif v == 4:
    print(4)
else:
    print('default')

実行結果

2 or 3

if文の詳しい使い方は以下の記事を参考にしてください。

if文を使った条件分岐の方法を解説

orなどを使って条件を複数定義したせいで見た目がスッキリしない場合は、in演算子とsetを使うことで見やすく条件をまとめることができます。

v = 2

if v == 1:
    print(1)
elif v in {2, 3}:     # in演算子とsetで条件をまとめる
    print('2 or 3')
elif v == 4:
    print(4)
else:
    print('default')

実行結果

2 or 3

辞書で代用する

辞書を使うことでもswitch文を代用できます。

v = 2
d = {1: 'one', 2: 'two', 3: 'three'}

# dのkeyにvがあるかどうか
if v in d:
    r = d[v]
else:
    r = 'デフォルト'

print(r)

実行結果

two

辞書(マップ)の使い方【dict】

分岐時に関数を処理したいなら辞書のvalueに関数の参照を渡しておけば可能です。

def a():
    print('a関数')

def b():
    print('b関数')

# 関数a,bの参照を渡しておく
d = {1: a, 2: b}
v = 1

if v in d:
    d[v]()    # 実行
else:
    print('デフォルト')

実行結果

a関数

可変長引数を使うことで引数が異なる関数も同じように呼び出すことができます。

# 可変長引数を定義
def a(*args, **keywords):
    print('a関数')

def b(*args, **keywords):
    print(f'b関数: {args[0]}')


d = {1: a, 2: b}
v = 2

if v in d:
    d[v](v)
else:
    print('デフォルト')

実行結果

b関数: 2

このように、状況に合わせて工夫することでswitch文が無くとも実装したい処理を実現することができます。

まとめ

この記事では、Pythonでswitch文を代用する方法を解説しました。

この他にも工夫の仕方によって色々な代用方法があると思いますが、あまり奇抜なやり方は可読性を著しく下げる恐れがあるのでやめておいた方が無難です。

switch文のメリットはやはり可読性にあります。代用で分かりにくいコードを使っていたら本末転倒なので気をつけましょう!

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

View Comments

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago