ユーニックス総合研究所

  • home
  • archives
  • python-case

Pythonでswitch-caseが使えなくて絶望しました【初心者向け】

  • 作成日: 2022-03-30
  • 更新日: 2023-12-25
  • カテゴリ: Python

Pythonでswitch-caseが使えなくて絶望しました

C言語をずっとやってきたのですが、Pythonを学ぶようになりました。
Pythonの生産性の高さに感銘を受けてPythonにのめり込むようになりました。

Cだと色々めんどうくさい処理を書かなければいけないのですが、Pythonだとライブラリで一発でできちゃう。
私は興奮しながらPythonを勉強しました。

しかし、ある時・・・。

C言語ではswitch文という文を使えます。
当然Pythonにもswitch文があると私は思っていました。
Pythonでswitch文を使ってみようと調べてみると・・・。

あれ? ない?
Python, switch文ない??

・・・。

絶望した!!!!!

switch-case文の代わりに使えるもの

私は絶望の中でのたうち回りながらネットの海をさまよいました。
どうもPythonにはswitch文が無いので、別の方法を使えという記事がちらほらあります。

そうなんだ・・・。
Pythonにはswitch文がないんだ・・・。

ではswitch文の代わりに私たちは何を使えばいいのだろう?
私はキーボードのエンターキーを「ッターン!」と押下。
荘厳なタイプ音が四畳一間の部屋に響き渡ります。

どうやらPythonではswitch文のかわりに↓を使うようです。

  • if文
  • 辞書
  • match文

if文を代わりに使う

「switch文なんてないからif文でガマンしろよ! なっ!」

Pythonは私に言いました。
そうなんだ・・・ガマンするしかないんだ・・・。

私は仕方なくif文を書きます。

n = 10  

if n == 0:  
    print('zero')  
elif n == 10:  
    print('ten')  
else:  
    print('else')  

↑の実行結果は「ten」と出力されます。
変数nの値は10なので、if文でn == 10の条件式がTrueになるからです。
↑のPythonのif文はC言語のswitch文で書き直すと↓のようになります。

int n = 10;  

switch (n) {  
case 0: printf("zero\n"); break;  
case 10: printf("ten\n"); break;  
default: print("else\n"); break;  
}  

たしかにswitch文はif文で代用が効きます。
そう考えるとPythonがswitch文を採用しなかったのは合理的な判断と言えるかもしれません。

しかし最近のPython(3.10以降)では「match文」というswitch文みたいな文も使えるようになっています。
最近のPythonの開発には先進派と呼ばれる人たちが多数参加していて、Pythonに色々な機能を盛り込んでいるようです。
Pythonは最初は比較的に保守的な言語でしたが、最近はそういう経緯もあって色々新しい機能が入っています。
match文もその1つです。

Go言語などはかなり保守的な言語で、Goの思想である「コンパクトな仕様」を壊す機能は導入が見送られています。
言語ごとにそういった特徴があるのは面白いですよね。

辞書を代わりに使う

if文書くのがめんどうくさいなぁ!!!

そう私は思いました。
そう言う人は辞書を代わりに使うと良いらしいです。

たとえば先ほどの整数のマッチングは↓のように書けます。

d = {0: 'zero', 10: 'ten'}  
n = 10  

if n in d.keys():  
    print(d[n])  
else:  
    print('else')  

↑の出力結果も「ten」になります。

なんかこれもif文を書いてるように見えますが、気のせいでしょう。
それにさっきよりずいぶんif文もコンパクトです。
これは分岐が増えても大丈夫でしょう。

おまたせしました!match文の登場です!

Python3.10からはmatch文という文が使えます。
これは聞くところによるとswitch文に近い構造を持つ文のようです。

私はさっそく自分の環境でmatch文を使ってみようと思いました。
しかし私の環境のPythonは・・・。

「3.9」

ざんねん、match文を使えません。

仕方ないので私はCPythonのソースコードから3.10をビルドすることにしました。
でもWSL2のUbuntu16.04ではビルドに失敗しました。

仕方ないのでDockerで最新のUbuntuで仮想環境を作って、そこでビルドしてみることにしました。
最新の言語は最新の環境でビルドする。鉄則ですよね。

これもすべて読者のみな様にmatch文の具合をお伝えするためです!
応援よろしくお願いします!

いつまで構築してんだよおらあ!
はよ3.10使わせろや!

そんな焦る気持ちを押さえながら・・・私は./configureを実行し、そしてmakeを実行。
純真なソースコードからバイナリを生成する興奮を味わいながら、ビルドログを眺めます。

3.10はどんな顔してるのかな? どんなエラー出すのかな? 仲良く出来るかな?
なんてことを考えながらビルドログを眺めます。

ビルドが終わって私は生成されたPythonを実行しました。
そこには「Python 3.11.0a5+」の表示が・・・。

Python3.10をビルドしようと思ったら間違ってPython.3.11をビルドしちまった・・・。
何を言ってるのかわからねーと思うが(ry

まぁ3.11でもmatch文は使えるのでよしとしましょう。
よしっ!

match文を使ってみた

Pythonのmatch文は↓のように使います。

n = 10  

match n:  
    case 0: print('zero')  
    case 10: print('ten')  
    case _: print('else')  

↑のコードをPython3.11で実行すると↓の結果になります。

ten  

match文のmatchの右側には式を書きます。
その値にマッチするcaseの処理が実行されます。
↑のmatch文ではn10なのでcase 10:にマッチしてprint('ten')が実行されています。

見た感じswitch文と似ていますね。
C言語のswitch文では整数しかマッチできませんでしたが、Pythonのmatch文では文字列なども使えます。

s = 'hello'  

match s:  
    case 'good': print('Good world')  
    case 'bad': print('Bad world')  
    case 'hello': print('Hi Python')  
    case _: print('ababa')  

↑のmatchはcase 'hello':にマッチします。

便利ですね!

おわりに

親愛なるPythonユーザーのみな様、今回私はPythonにswitch-caseがないことに絶望しました。
あられもない姿をお見せしてしまい深く反省しております。
私のことは嫌いになってもPythonのことは嫌いにならないでください!

結論としてはPythonのバージョンを3.10以降に上げて、match文使いましょうということになりました。
よろしくお願いしします。

🦝 < マッチマッチマッチです

🐭 < ビルド時間は瞑想時間