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文ではn
が10
なので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文使いましょうということになりました。
よろしくお願いしします。
🦝 < マッチマッチマッチです
🐭 < ビルド時間は瞑想時間