はじめに
最近、Pythonのソート処理を書いていたときに、:= という記号に出会いました。これは 代入式 (Assignment Expression)、通称 セイウチ演算子 (Walrus Operator) と呼ばれる、**Python 3.8(2019年10月リリース)**で導入された機能です。
この記事は、私がこの機能を学んだ際の備忘録として、その最大のメリットである**「処理の冗長性を排除」**する方法をシンプルなコード例でまとめます。
1. 代入式(:=)の基本
代入式は、「式 (Expression) の中で代入を行い、その結果(代入された値)を返す」という二つの動作を同時に行います。
これにより、**「計算結果を変数に保存しつつ、その値をすぐに次の処理で使う」**ことが可能になります。
2. メリット1:リスト内包表記での冗長な計算の排除
代入式は、計算コストの高い処理の結果を、フィルタリング(if)と要素生成の両方で使いたい場合に絶大な効果を発揮します。
課題: リスト内の要素を2乗し、結果が10より大きいものだけを抽出したい。
❌ 代入式がない場合:2乗の計算が2回実行される
data = [1, 2, 3, 4, 5, 6]
# 2乗の計算が2回実行されてしまう
result_bad = [
x * x # 2乗 (2回目)
for x in data
if x * x > 10 # 2乗 (1回目)
]
⭕ 代入式を使う場合:計算を1回に集約!
data = [1, 2, 3, 4, 5, 6]
# 計算は1回だけ!結果をyに代入し、ifの条件としてyを使う
result_good = [
y # 2乗の結果yを要素として採用
for x in data
if (y := x * x) > 10 # 2乗の計算 (1回だけ) を行い、yに代入
]
ファイルI/OやAPI呼び出しなど、重い処理であればあるほど、この効果は大きくなります。私が遭遇したソート処理での row.split(',') も同様のケースです。
3. メリット2:while ループの記述を劇的に簡潔に
代入式は、データの取得とループ条件の判定を同時に行う必要がある while ループの記述を劇的に簡潔にします。
❌ 代入式がない場合:データ取得処理が重複
# データの読み込み処理を想定
chunk = read_next_chunk() # 1. 最初のデータ取得
while chunk:
process(chunk)
chunk = read_next_chunk() # 2. 次のデータ取得
⭕ 代入式を使う場合:条件式に集約し、コード量を削減
# データを取得して data に代入し、それが有効ならループ続行
while (data := read_next_chunk()):
process(data)
非常にスッキリとし、コードの意図が伝わりやすくなりました。
まとめ
Python 3.8で導入された代入式 := は、コードの簡潔さと実行効率を高めるためのモダンなテクニックです。
- 効果: 冗長な計算や処理を排除し、コードを短く、速くする。
-
用途: リスト内包表記や
whileループの条件式などで活躍。
このセイウチ演算子を使いこなして、皆さんのPythonコードもより洗練されていくと嬉しいです!