CTC 教育サービス
[IT研修]注目キーワード Python Power Platform 最新技術動向 生成AI Docker Kubernetes
こんにちは、菱沼です。
今回も「きれいなPythonプログラミング(マイナビ出版)」という書籍を利用して学習します。
前回は、Pythonの辞書を安全に使うときに便利なメソッド(get、setdefault)と、辞書クラス(defaultdict)ついて学びました。
今回は、if文の代わりに使用できる辞書と、match-case文について学びます。
if-elif-else文を書いているとやたら長くなってしまうことがあるかと思います。
今回学習する内容としては、こういったケースで、if-elif-else文の代わりに辞書を使うという方法があり、その方法について学ぶということになります。
まず書籍からの引用で、if-elif-else文の書き方を改めて確認してみます。
------------------------------------
P.105
Javaなどの言語にはswitch文がありますが、これはif-elif-else文の一種であり、特定の変数がいくつかの値を持つとき、その値に基づいたコードを実行します。Pythonにはswitch文がないので、Pythonプログラマーは次のようなコードを書くことがあります。
(中略)
# ifとelifの条件式の部分すべてに"season =="が書かれている
if season == ’Winter’:
holiday = ’New Year\’s Day’
elif season == ’Spring’:
holiday = ’May Day’
elif season == ’Summer’:
holiday = ’Juneteenth’
elif season == ’Fall’:
holiday = ’Halloween’
else:
holiday = ’Personal day off’
(中略)
defaultでは、JavaのSwitch文は「フォールスルー(各行が上から順に実行される)」になっていて、各ブロックがbreak文で終わる必要があります。break文を書かないと実行は次のブロックへと移ってしまいますので、忘れるとバグの原因になります。とはいえ、この例ではif-elif文を何度も繰り返し書くことになります。
------------------------------------
このサンプルコードでは、変数seasonに入れられた値に対して、設定された文章を代入するというものになっています。例えば変数にSpringが入ったのならMay Dayという文章が代入されます。
蛇足)
ところで、私自身はJavaを学んだことがなかったので、break文の扱いについて「ん?」となりました。
Pythonのbreak文と言えば、forやwhileのループの際にif文で設定した条件(例:5回繰り返すなど)に到達したら、処理を停止する目的で使用されていました。
例)
for a in range(1, 10):
if a > 5 :
print("おしまい")
break
一方、Javaの場合は、上から順番にコードを実行した結果、条件に一致した後、switch文から抜けるためにbreakを使うそうです。なので、breakがなければ、たとえ最初の条件が合致したとしても、次のブロックに進んでしまうということです。
なので、PythonとJavaのbreakの違いというとかなり近いものの、Pythonでは主にループで使い、Javaではswitch文にも使えるということのようです。
サンプルコードで見てみるとわかる通り、if文で書いたとき、状況によってはやたら長くなります。
なので、そういったときに代わりに辞書で書く方もおられるそうです。
ではここで、辞書を使って書かれた場合、どう書くのか、書籍から引用します。
------------------------------------
P.105
holiday = {’Winter’: ’New Year\’s Day’,
’Spring’: ’May Day’,
’Summer’: ’Juneteenth’,
’Fall’: ’Halloween’}.get(season, ’Personal day off’)
このコードは代入文が1つあるだけです。holidayに格納される値はget()の戻り値で、seasonに設定されているキーの値を返します。
------------------------------------
短い。ただ、短い代わりにちょっと読みづらくなってしまうケースもありそうです。
.get()は前回の学習で出てきました。
・get()メソッド
書式:辞書名.get(key, デフォルト値)
辞書から値を取得し、キーが存在しない場合にはデフォルト値を返すもの。
というものなので、elseになったときに返す値=辞書の中にキーが存在しないということになりますので、.get()でデフォルト値として設定したものを返すことができるということになります。なので、最初のサンプルコードでのelseの部分をこの表現で書くことができるということです。
ところで、if-elif-else文、switch文と聞いたときに、「あれ?match-case文ってなかったっけ?」と思いました。
match-case文は2021年にリリースされたPython3.10で追加された機能です。
この項目ではmatch-case文について触れられていなかったので、何でだろうと調べると、この書籍自体は2022年に発売されたものですが、原文は2020年に書かれており、3.10がリリースされる前のものになっていました。
せっかくなので、match-caseについても確認してみたいと思います。
match-case文は「値によって処理を分岐するための構文」ということで、単純な値分岐という用途ではif文に近いようです。実際、この機能が追加される前に検討された折にはif文があるからいいかと見送られ続けてきたんだそうです。
(参考:Python3.10の目玉はmatch文、新バージョンは焦らず状況を見て使っていこう:マイナビ)
どちらを使うべきかについては上記のサイトではその時の用途によって適したものを使えばいいということで、いろいろ試していくしかないかなと思います。
基本のmatch文の構文はこちら。
match 変数:
case 値:
処理
case _:
当てはまらないときの処理
これをもとに、先ほどのサンプルコードをmatch case文で書くならどう書くのか。こんな感じになるようです。
match season:
case ’Winter’:
holiday = ’New Year\’s Day’
case ’Spring’:
holiday = ’May Day’
case ’Summer’:
holiday = ’Juneteenth’
case ’Fall’:
holiday = ’Halloween’
case _:
holiday = ’Personal day off’
if文よりは見やすい気はしますが、行数的にはほぼ同じですね。
これを見てみると、複雑な条件分岐が必要な時はif文、今回のような単純な分岐の時はmatch文というように使い分ければいいのかも。
今回はif文と、if文の代わりに辞書を使う方法、match文について学びました。
どの方法が絶対というものはないということなので、いろいろとコードを試しながら学習していきたいと思います。
それではきりが良いのでこちらで終了です。
今回もお付き合いいただきありがとうございました。
[IT研修]注目キーワード Python Power Platform 最新技術動向 生成AI Docker Kubernetes