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

### はじめに
`Python3.10` から `match文` が搭載されました。

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

<font color='red'>※注記※
正規表現にもmatch関数というものがあるので、混在しないように気をつけてください。完全に別物です。
正規表現のmatch関数については以下の記事を参考にしてみてくださいね。</font>

[Python 正規表現のmatch関数](https://ai-inter1.com/python-regex-match/)

---

### 動作確認環境
OS: mac OS Monterey 12.1 (M1 Mac)
環境: miniforge (conda環境)
Python: 3.10.1
エディタ: Visual Studio Code

<font color='red'>※注記※
必ず、Python 3.10.0以上で実行してください。</font>

---

### 環境構築
まずは環境構築から、condaでPython3.10.1の環境を作ります。
ターミナルを開いて

```bash
# 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文` で後ほど書いてみることとします。

```python
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文` で記載しています。

```python
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` といった処理でも入れることはできません。
> 詳しくは以下のリンクを確認してください。

[パターンの文法](https://www.python.jp/news/wnpython310/index.html#パターンの文法)

---

### match.py
先程エラーになってしまったので、ちゃんと出力できるコードにします。
`case` のパターンで演算処理を含む条件式を入れるには、`if文` を使います。

```python
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文` を使う必要はなく、`if文` の処理で十分だとは思います。

---

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

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

---

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