ウォルラス演算子とは
2019 年に Python 3.8 で追加された機能で、セイウチ演算子という愛称で親しまれている?らしいです。
変数名 := 式
の記法で、値の代入と条件の判定を 1 行でできます。
かなり昔に追加された機能のようですが、ついさっき知ったので記事を書いてみようと思います。
コピーして動くサンプルコード
このクラスは数値の配列と閾値を渡して、各数値を 2 倍したとき、閾値を超えている数値の配列を返すものです。
ウォルラス演算子を使った場合と使わなかった場合で見比べられるようにしました。
test.py
class AboveThresholdDoubledNumbersExtractor:
def __init__(self, numbers: list[int], threshold: int) -> None:
self._numbers = numbers
self._threshold = threshold
def without_walrus_operator(self) -> list[int]:
above_threshold = []
for num in self._numbers:
doubled_num = num * 2
if doubled_num > self._threshold:
above_threshold.append(doubled_num)
return above_threshold
def with_walrus_operator(self) -> list[int]:
above_threshold = []
for num in self._numbers:
if (doubled_num := num * 2) > self._threshold:
above_threshold.append(doubled_num)
return above_threshold
def without_walrus_operator_in_list_comprehension(self) -> list[int]:
return [num * 2 for num in self._numbers if num * 2 > self._threshold]
def with_walrus_operator_in_list_comprehension(
self,
) -> list[int]:
return [
doubled_num
for num in self._numbers
if (doubled_num := num * 2) > self._threshold
]
if __name__ == "__main__":
nums = [10, 20, 30, 40, 50]
threshold = 50
extractor = AboveThresholdDoubledNumbersExtractor(nums, threshold)
a = extractor.without_walrus_operator()
b = extractor.with_walrus_operator()
c = extractor.without_walrus_operator_in_list_comprehension()
d = extractor.with_walrus_operator_in_list_comprehension()
print(a)
print(b)
print(c)
print(d)
感想
num * 2 程度であればその恩恵は感じられないのかもしれませんが、処理の結果に意味を持たせながら条件の判定もできるのは嬉しいです。
趣味の開発では可読性を損なわない範囲で積極的に使っていきたいですね。
セイウチ演算子を使うべきではないと思しき場面に直面したらこの記事を更新しようと思います。