0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Python】Python3.10以降の新機能 match文を使ってみる

Last updated at Posted at 2022-01-09

はじめに

Python3.10 から match文 が搭載されました。

match文 は 従来のif文 と異なり条件式に対応できないという、落とし穴があるのと、
if文と同じように、for文と組み合わせて使うことが多いと思ったので、そこら辺を記載しようかなと思います。

※注記※
正規表現にもmatch関数というものがあるので、混在しないように気をつけてください。完全に別物です。
正規表現の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の環境を作ります。
ターミナルを開いて

# 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がフォルダーに格納されているので、これらを編集して、実行し動作を確認していきます。


if.py

まずは従来の if文 を使った処理を書いてみます。
この if文 の内容を 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:
    if i % 2 == 0:
        list_mult2.append(i)
    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]

リスト、for文、if文 を使っています。
実行すると、2の倍数が表示されて、2の倍数を除いた3の倍数が表示されて、それ以外の数字が表示されます。
3の倍数をすべて表示したい場合は、すこし複雑な処理になるので、ここでは割愛させてください。


match_error.py

上記の if文 処理を 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 % 2 == 0:
            list_mult2.append(i)
        case i % 3 == 0:
            list_mult3.append(i)
        case _:
            list_others.append(i)

print(list_mult2)
print(list_mult3)
print(list_others)
# 実行結果
    case i % 2 == 0:
           ^
SyntaxError: expected ':'

エラーが表示されれば成功です。
これがif文 と異なる、match文 の落とし穴です。
case のパターンには、演算処理を入れることはできません。
例えば、 i + 1 といった処理でも入れることはできません。
詳しくは以下のリンクを確認してください。

パターンの文法


match.py

先程エラーになってしまったので、ちゃんと出力できるコードにします。
case のパターンで演算処理を含む条件式を入れるには、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:
        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]

正しく表示することができましたね。
caseif文 を取り入れることで、match文 でも条件処理ができました。
結局 if文 を使っているので、わざわざ match文 を使う必要はなく、if文 の処理で十分だとは思います。


match文のメリット

match文True/False のように、〇〇の値が0の場合、1の場合といった条件分岐に非常に強いと思います。

if文でもこの処理はできますが、match文のほうが見やすく解読しやすいと思いますね。


さいごに

簡単な match文 の紹介でした。
match文 は導入されたばかりで、今後アップデートで条件式が使えるようになったりとか、処理が変化していくかもしれません。
Python のバージョンアップが合った場合には、都度動作を確認してみてくださいね。

0
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?