Java、C#など様々なプログラミング言語で利用できるswitch文ですが、Pythonには実装されていません。
しかし、同じような処理を行わせる方法は存在します。
今回は、そんな switch文と同じような処理をPythonで実装する方法について、まとめます。
switch文はどう表現するか?
一般的にプログラミングの構文の1つである条件分岐には、if文とswitch文が存在します。(swich文の詳細はこちら)どちらも条件式から得られる結果を基に処理を分けるための構文です。
ただし、言語によっては、switch分が実装されていないものもあります。Pythonも実装されていない言語の1つです。
そのため、switch文のような処理を行う場合は、Pythonでは「if文」を使用して実装するようになります。(if文の詳細はこちら)
if文を利用する方法は簡単で理解もしやすいと思います。しかし、if文では、場合分けするパターンが多い場合、記述量が膨大になっていきます。そのため、可視性も低下してしまうでしょう。
そのような場合は、辞書(dictionary)という機能を利用するのも良いでしょう。(辞書型の詳細は、こちら:定義と出力・追加と削除・便利な構文)
それぞれの方法については、以下で記載していきます。
if文とswitchの比較
Javaで記載されたswitch文を、Pythonのif文に記載を改めてみましょう。
以下は、Javaで記載されたswitch文のコードの例です。
コードサンプル:
public static void main(String[] args) throws Exception {
int num = 10;
switch(num % 2){
case 0:
System.out.println(“偶数です”);
break;
case 1:
System.out.println(“奇数です”);
break;
}
こちらと同等の処理をPythonのif文で記載してみます。
コードサンプル:
num = 10
if (num % 2 == 0):
print(“偶数です”)
elif (num % 2 == 1):
print(“奇数です”)
一見、Pythonのif文の記載の方が、コード量も少なく非常に簡単だと思います。パターン数が多い場合はどうなるでしょうか?
Javaで記載されたswitch文で、パターン数を増やしたコードの例を以下に示します。
コードサンプル:
public class Sample {
public static void main(String[] args) throws Exception {
int num = 6;
switch(num / 2){
case 0:
case 2:
System.out.println(“商は偶数です”);
break;
case 1:
case 3:
System.out.println(“商は奇数です”);
break;
}
}
}
こちらと同等の処理をPythonのif文で記載してみます。
コードサンプル:
num = 6
if (num / 2 == 0):
print(“商は偶数です”)
elif (num / 2 == 1):
print(“商は奇数です”)
elif (num / 2 == 2):
print(“商は偶数です”)
elif (num / 2 == 3):
print(“商は奇数です”)
これを見ると、プログラミング初心者の方は特にPythonのif文の方が分かりやすいと感じるかもしれません。しかし、このように、1つ1つ分岐の処理を記載していく必要があるため、バグを埋め込む可能性が高くなる事実があります。
また、「計算式が多い」ということは、「処理を行う回数も多い」ということです。switch文では、計算や比較の処理は1回のみで、そこで得られた答えに基づいた場合分けが出来ています。しかし、if文では、都度計算をするため、処理速度も遅くなります。
もちろん以下のように書き換えることも出来るでしょう。
コードサンプル:
num = 6
ans = num / 2
if (ans == 0):
print(“商は偶数です”)
elif (ans == 1):
print(“商は奇数です”)
elif (ans == 2):
print(“商は偶数です”)
elif (ans == 3):
print(“商は奇数です”)
しかし、都度比較するための処理が入ることは変わりません。各々で計算するよりは処理が早いかもしませんが、switch文には敵わないでしょう。
もちろん、「ヒットする分岐の場所」や「分岐毎の処理内容」にも依るため、一概には言えません。ですが、分岐数が多いほど、この傾向は強くなります。
dicrionalyとswitchの比較
先述しましたが、パターン数が多い場合はdictionaryを使用することで、可読性が高くなるというメリットがあります。
Javaで記載された以下のswitch文のコード(先述)をPythonのdictionaryで記載してみます。
コードサンプル(Java):
public class Sample {
public static void main(String[] args) throws Exception {
int num = 6;
switch(num / 2){
case 0:
case 2:
System.out.println(“商は偶数です”);
break;
case 1:
case 3:
System.out.println(“商は奇数です”);
break;
}
}
}
コードサンプル(Python):
num_dic = {0:”商は偶数です”, 1:”商は奇数です”, 2:”商は偶数です”, 3:”商は奇数です”}
num = 6
num = num / 2
num = int(num)
print(num_dic[num])
dictionaryでは、辞書の箇所に登録する必要はありますが、処理自体は非常に分かりやすいものになるでしょう。
また、if文では分岐の度に演算処理が入っていましたが、こちらでは1度の演算処理でその結果を使用しています。そのため、処理速度も上がる傾向があるでしょう。
まとめ
今回は、switch文と同じような処理をPythonで実装する方法ついて記載しました。
switch文とは違い、できることの制限はありますが、非常に有効な構文だと思います。
ぜひ、参考にしてみて下さい。