「Python にはなぜ switch文 がないんだろう?」と思うことはありませんか?
特に、Java や C++ など Python 以外のプログラミング言語の経験者の方。
私は、 Arduino というマイコンを使ってロボットの制御をする機会があります。
その際、switch文がとても重宝し「Pythonでも使いたい」と思います。
この記事では、Python で switch / case のような処理を実現する方法をご紹介します。
対象者は Python で if、elif、else の基本が理解できている方ですが、dict型( key と value の関係)を理解していれば尚良いです。
ifについて、こちらの記事が参考になります。
イメージをつかんでもらえるように例題を明記していますので、初心者の方も安心してご覧下さい。
switch文とは?
プログラミングにおける条件分岐の制御構文の一つ。
特に「多岐分岐」を分かりやすく処理することができます。
使用できるプログラミング言語は C言語 や Java など多くの言語が対応しています。
基本的な書式は下図の通りです。
switch (式) {
case 値A:
// 式が値Aと一致したときの処理
break;
case 値B:
// 式が値Bが一致したときの処理
break;
default:
// 式が値どのcaseとも一致しなかったときの処理
}
例えば「成績(evaluation)に対する評価を出力する」という場合。
以下の様に記述すればOKです。
String evaluation = "A";
switch (evaluation) {
case "S":
System.out.println("合格");
break;
case "A":
System.out.println("もう少し頑張りましょう");
break;
case "B":
System.out.println("追試を受けてください");
break;
default:
System.out.println("単位はあげません");
}
とても分かりやすいですね。
この場合、変数evaluation には「A」が入っていますから、case に当てはまるのは「case “A”」となり、実行結果は以下の通りです。
もう少し頑張りましょう
なお、上記はクラスの記述などを省略していますのでご了承ください。
Pythonでswitch文が使えない理由
「使えない」というと語弊があります。
もう少し正しく表現すると「あえて用意されていない」ということのようです。
では、なぜ「用意されていないのか」というと、「if / elif / else で同じことができるから」だそうです。
それは確かにそうなのですが、個人的にはさみしい限りです。
switch文が得意な場面と苦手なこと
苦手というより、できることとできないことを明確にしておきましょう。
switch文 では、「範囲を指定した条件」が設定できません。
「値が10以上なら case “A”」のような処理ができないのです。
あくまでも「値がAなら case “合格”」のように単純な条件の場合に使います。
それでも、多岐にわたる分岐を分かりやすく記述できるので、やはり個人的には使いやすい制御構文だと思います。
Pythonでswitch文と同じ処理をやってみよう
「絶対に switch文 でなければできない処理」というものはありませんので、比較しながら同じ処理を他の方法で実現する方法を2つご紹介します。
if/elif/elseだけで実現する場合
上の switch文 の例と同じ処理を、Python の if文 で記述すると以下の様になります。
evaluation = 'A'
if evaluation == 'S':
print('合格')
elif evaluation == 'A':
print('もう少し頑張りましょう')
elif evaluation == 'B':
print('追試を受けてください')
else:
print('単位はあげません')
十分わかりやすいですね。
しかし、若干「冗長的」に見えてしまうのは私だけでしょうか。
switch文 と比較すると、
- switch に対する if の条件
- case に対する elif の条件
- default に対する else の処理
となっており、同じ条件分岐が実現できています。
dict(辞書型)で実現する場合
今回の記事で最も紹介したい内容です。
上の様に if文 でも十分処理できるのですが、switch文 と同じ形態で処理するための方法として「dict(辞書)型」を使う方法があります。
evaluation = 'A'
msg = {
'S': '合格',
'A': 'もう少し頑張りましょう',
'B': '追試を受けてください',
}
if evaluation in msg:
print(msg[evaluation])
else:
print('単位はあげません')
msgには、key(S/A/B)に対するvalue(合格/もう少し頑張りましょう/追試を受けてください)の
組み合わせを用意し、key(今回はA)に対応するvalue(もう少し頑張りましょう)を出力しています。
該当する key がない場合、else の処理が行われます。
switch の例でいうところの default が else になります。
dict(辞書型)では実現できない場合
この方法は分かりやすく便利な方法ではありますが、あくまで単純な場合に限ります。
switch文 と同じように、「範囲を指定した条件」は設定できません。
結局、「 if / elif / else の組み合わせが一番汎用的で使いやすい」ということですね。
まとめ
今回はPython で switch / case文 の処理を実現する方法を解説しました。
if / elif / else を組み合わせたらできるけど、辞書型を使う方法は知らないという方も多いようです。
もちろん、「範囲指定では使えない」という制限はありますが、一つの方法として覚えておいて損はありませんよね。
今後も便利で面白い実装方法をご紹介します。
Pythonについて詳しく知りたいという方は、こちらの書籍もおススメです。
それでは、ステキなPythonライフを!