ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Python - 代入式・セイウチ演算子

初めに

 本記事は代入式やセイウチ演算子と呼ばれるものを解説します。Python3.8から実装されたもので、セイウチ演算子を使うことで条件式の記述の冗長性をなくすことができることがあります。

代入式・セイウチ演算子とは

 Python3.8から変数に値を割り当てる構文として、:=が追加されました。これはセイウチの目と牙に見えるため、セイウチ演算子と呼ばれることがあります。
 セイウチ演算子を使うことで変数の代入と変数の使用を同時に行うことができます。

(例)

# セイウチ演算子
# n に 4 を代入しながら, 3 より大きいか判定している
if (n := 4) > 3:
    print("f{n}は3より大きい")
else:
    print("f{n}は3以下")

使い方の例

条件式の中で変数を再利用したい場合

 リストの長さのようなものを代入し、条件式の中で再度使いたい場合はセイウチ演算子を使うことで冗長性をなくすことができます。

array = [1, 2, 3]

# n に array の長さを代入して, 3 と比較
if (n := len(array)) > 3:
    print("f{n}は3より大きい")
else:
    print("f{n}は3以下")

 上のコードをセイウチ演算子を使わずに記述すると次のようになります。len(array)が複数現れます。

array = [1, 2, 3]

if len(array) > 3:
    print(str(len(array)) + "は3より大きい")
else:
    print(str(len(array)) + "は3以下")

 他の例としては正規表現でマッチした部分を抽出するときにも、条件式内で変数を再利用することが多いため、セイウチ演算子が使われることがあります。

import re

text = "今日は2024年3月16日です。"

# 年、月、日をそれぞれキャプチャするグループ
pattern = r"(?P<year>\d{4})年(?P<month>\d{1,2})月(?P<day>\d{1,2})日"

# 正規表現でマッチした部分が存在する場合
if (m := re.search(pattern, text)):
  print(m.group())  # => 2024年3月16日
else:
  print("日付が見つかりませんでした。")

fineworks-fine.hatenablog.com

注意点

 セイウチ演算子を用いて、代入したあとに比較する際はセイウチ演算子部分を括弧で囲む必要があります。

 括弧で囲まない場合は処理が変わります。

# n に 5 を代入した後に, n > 4 をする
if (n := 5) > 4:
    print(n)    # 出力 : 5

# n に 5 > 4 の結果を代入する. よって n に True が代入される
if n := 5 > 4:
    print(n)    # 出力 : True