かゆい所に手が届く解説

Python で switch / case文 の処理を実現する

2023年9月追記:Python3.11にて、match/case文が使えるようになりました!興味がある方はこちらの記事をご覧ください。

「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ライフを!

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 最近ではPythonを用いたアプリ開発、ウェブアプリケーションの開発と運営に没頭。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です