こんにちは、機械学習の講師をしている木下です!
Python 3.10 から追加された match 文と呼ばれる構文を使ったことがあるでしょうか?
match 文は if 文のような使い方ができます。
それでは何が if 文と異なり、どのような時に便利なのでしょうか?
うまく使いこなすとすごく便利な新機能なのでぜひこの記事で使い方をマスターしていきましょう!
match 文ならではの注意事項もお伝えしますので、Python を活用したい方必見です!
ゼロから始めるプログラミング
スモールステップで Python を基礎から学べる、初学者の方向けの講座です。演習問題を通して Python の使い方を理解し、データ分析や機械学習実装のための基礎を身につけることを目指します。
実行環境
- OS: mac OS Monterey 12.1 (M1 Mac)
- 環境: miniforge (conda環境)
- Python 3.10.1
- エディタ: Visual Studio Code
環境構築
まずは環境構築から、conda で Python3.10.1 の環境を作ります。Google Colaboratory でも実行できるのでお気軽に試してみてください。
ターミナルを開いて以下のように実行していきましょう。
# conda で Python3.10.1 の環境構築
conda create -n python310 python==3.10.1
conda activate python310
# Python 3.10.1であることを確認
python -V
今回の実装のためのフォルダとファイルも作成しておきます。
# デスクトップに作業フォルダと空のpythonファイルを作成
cd ~/Desktop
mkdir match_test
cd match_test
touch if.py
touch match.py
touch match_error.py
デスクトップに match_test というフォルダーが作成されているので、Visual Studio Code などで開きます。
if.py, match.py, match_error.py がフォルダーに格納されているので、これらを編集して、実行し動作を確認していきます。
match 文とは
まずは match 文の書き方を見ていきましょう。
for
文の構文case パターン 1:
return 返り値 1
case パターン 2:
return 返り値 2
case _:
return 例外処理
上記のように書いたとき、変数がパターン 1 であれば返り値 1、パターン 2 であれば返り値 2, それ以外の値であれば例外処理の結果が返ってきます。
実際にコードを書いて確認してみましょう。
match 文の実装
ここで、以下のような if 文による記述と match 文を比較してみましょう。
if 文による処理
まずは一般的な if 文を見ていきましょう。
ここでは数字を 2 の倍数、3 の倍数、それ以外の順番に別々のリストに格納していくコードを記述します。
if.py に以下のように記述して、コードを実行してみてください。
# 分割する数字
list = [1, 2, 3, 4, 5, 6, 8, 10, 11, 13, 15, 17, 19, 20, 22, 23]
list_mult2 = []
list_mult3 = []
list_others = []
for i in list:
# 2 の倍数を格納
if i % 2 == 0:
list_mult2.append(i)
# 3 の倍数を格納
elif i % 3 == 0:
list_mult3.append(i)
# それ以外を格納
else:
list_others.append(i)
print(list_mult2)
print(list_mult3)
print(list_others)
# 実行結果
# [2, 4, 6, 8, 10, 20, 22]
# [3, 15]
# [1, 5, 11, 13, 17, 19, 23]
if 文の使い方については以下の記事も参考にしてください。
match 文による処理 1
ここでは 実際に match 文を使って if 文を書き換えてみましょう。
サンプルコードは以下の通りです。
# 分割する数字
list = [1, 2, 3, 4, 5, 6, 8, 10, 11, 13, 15, 17, 19, 20, 22, 23]
list_mult2 = []
list_mult3 = []
list_others = []
for i in list:
match i:
# 2 の倍数を格納
case i % 2 == 0:
list_mult2.append(i)
# 3 の倍数を格納
case i % 3 == 0:
list_mult3.append(i)
# その他
case _:
list_others.append(i)
# 実行するとエラーが返ってきます
# 実行結果
case i % 2 == 0:
^
SyntaxError: expected ':'
実際に実行するとエラーが返ってきます。
これが if 文と異なる、match 文の落とし穴です。これはなぜでしょうか?
実は case のパターンには、計算処理を入れることはできません。
例えば、i + 1 といった処理を入れることはできないのです。
正しい match 文の記述
上記のコードを正しく書き換えると以下のようになります。
# 分割する数字
list = [1, 2, 3, 4, 5, 6, 8, 10, 11, 13, 15, 17, 19, 20, 22, 23]
list_mult2 = []
list_mult3 = []
list_others = []
for i in list:
match i:
case i if i % 2 ==0:
list_mult2.append(i)
case i if i % 3 ==0:
list_mult3.append(i)
case _:
list_others.append(i)
print(list_mult2)
print(list_mult3)
print(list_others)
# 実行結果
# [2, 4, 6, 8, 10, 20, 22]
# [3, 15]
# [1, 5, 11, 13, 17, 19, 23]
正しく分割することができました。
このように case 内で if 文を取り入れることで、match 文でも条件処理ができました。
結局 if 文を使っているので、わざわざ match 文を使う必要はなく、冗長な処理にみえるのではないでしょうか。
match 文のメリット
それではどんなときに match 文は有効なのでしょうか?
メリットとして True/False の値が入る変数のように、〇〇の値が 0 の場合、1 の場合といった条件分岐に非常に強いことが挙げられます。
またタプル型などで複数の値が格納されている場合にもスムーズに条件分岐を書くことができます。
if 文でもこれらの処理はできますが、match 文のほうが見やすく解読しやすいケースが多くありますので、if 文が冗長になっているときはぜひ試してみてください!
最後に
本記事では match 文の紹介を行いました。
match 文は導入されたばかりで、今後アップデートで条件式が使えるようになったりとか、処理が変化していくかもしれません。
Pythonのバージョンアップがあった場合には、都度動作を確認してみてください!
もし、業務で使われる場合は、アップデートに対応する必要があるので、通常の if 文処理で記載するほうが良い場合も多くあります。チームリーダーなどに確認してみてください。
以下、まとめになります。
- match 文は 条件分岐を簡潔に書くことができる構文
- 条件分岐には数式などを扱うことが不可
- 複数の変数を扱う場合などに match 文は特に力を発揮
もし忘れてしまったら本記事を思い出して再度復習してみてください。
以上、Python 学習している方々のお力添えになれば幸いです!
まずは無料で学びたい方・最速で学びたい方へ
まずは無料で学びたい方: Python&機械学習入門コースがおすすめ
AI・機械学習を学び始めるならまずはここから!経産省の Web サイトでも紹介されているわかりやすいと評判の Python&機械学習入門コースが無料で受けられます!
さらにステップアップした脱ブラックボックスコースや、IT パスポートをはじめとした資格取得を目指すコースもなんと無料です!
最速で学びたい方:キカガクの長期コースがおすすめ
続々と転職・キャリアアップに成功中!受講生ファーストのサポートが人気のポイントです!
AI・機械学習・データサイエンスといえばキカガク!
非常に需要が高まっている最先端スキルを「今のうちに」習得しませんか?
無料説明会を週 2 開催しています。毎月受講生の定員がございますので確認はお早めに!
- 国も企業も育成に力を入れている先端 IT 人材とは
- キカガクの研修実績
- 長期コースでの学び方、できるようになること
- 料金・給付金について
- 質疑応答
参考リンク
ゼロから始めるプログラミング
スモールステップで Python を基礎から学べる、初学者の方向けの講座です。演習問題を通して Python の使い方を理解し、データ分析や機械学習実装のための基礎を身につけることを目指します。