こんにちは、機械学習の講師をしている木下です!
Python 3.10 から追加された match 文 と呼ばれる構文を使ったことがあるでしょうか?
match 文は if 文のような使い方 ができます。 それでは何が if 文と異なり、どのような時に便利なのでしょうか?
うまく使いこなすとすごく便利な新機能 なのでぜひこの記事で使い方をマスターしていきましょう!
match 文ならではの注意事項もお伝えしますので、Python を活用したい方必見 です!
注意
正規表現にも match 関数というものがあるので、混同しないように気をつけてください。完全に別物です。
実行環境
OS: mac OS Monterey 12.1 (M1 Mac)
環境: miniforge (conda環境)
Python 3.10.1
エディタ: Visual Studio Code
注意
必ず、
Python 3.10.0 以上 で実行してください。
環境構築
まずは環境構築から、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
文の構文
match 変数:
case パターン 1:
return 返り値 1
case パターン 2:
return 返り値 2
case _:
return 例外処理
上記のように書いたとき、変数がパターン 1 であれば返り値 1、パターン 2 であれば返り値 2, それ以外の値であれば例外処理 の結果が返ってきます。
実際にコードを書いて確認してみましょう。
match 文の実装
ここで、以下のような if 文による記述と match 文を比較してみましょう。
if 文による処理
まずは一般的な if 文を見ていきましょう。
ここでは数字を 2 の倍数、3 の倍数、それ以外の順番に別々のリストに格納していくコードを記述します。 if.py に以下のように記述して、コードを実行してみてください。
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:
# 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 文を書き換えて みましょう。 サンプルコードは以下の通りです。
def による関数の宣言# 分割する数字
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 文の記述
上記のコードを正しく書き換えると以下のようになります。
def による関数の宣言# 分割する数字
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 3.9.2 ドキュメント
参考
Chainer チュートリアル
大学院修士、博士課程で人工知能に関する研究に従事。大学院を休学し、2021年4月から新卒社員としてキカガクにジョイン。学生時代は、自然言語処理技術や深層学習を用いて、教育データ解析のための新たなモデルを作成したりしていました。