0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python コードが劇的にスッキリ!代入式(`:=`)で処理の冗長さをなくす【Python 3.8+】

0
Posted at

はじめに

最近、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コードもより洗練されていくと嬉しいです!

0
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?