Pythonの代入式(セイウチ演算子):式の中で変数代入を行う方法と活用パターン

Python 3.8から導入された**代入式(Assignment Expressions)**は、変数への代入と、その値の評価を同時に行うための機能です。

演算子の形状 := が、横を向いたセイウチ(walrus)の目と牙に見えることから、通称**「セイウチ演算子(Walrus Operator)」**と呼ばれています。

この記事では、代入式の基本的な構文と、コードの効率や可読性を向上させるための具体的な活用例(if文、while文、リスト内包表記)について解説します。

目次

代入における「文」と「式」の違い

Pythonにおいて、通常の変数代入(=)は「文(statement)」として扱われます。文は値を返さないため、計算式の一部として組み込むことはできません。

# 文法エラー (SyntaxError) になる例
# x = (y = 10) + 5

一方、代入式(:=)は「式(expression)」として扱われます。式は値を返すため、他の演算の一部や、関数の引数、条件式の中に記述することができます。

# 代入式を使用した例
# 1. y に 10 が代入される
# 2. (y := 10) 全体が 10 と評価される
# 3. 10 + 5 が計算され、x に 15 が代入される
x = (y := 10) + 5

print(f"x: {x}")
print(f"y: {y}")

実行結果:

x: 15
y: 10

活用例1:if 文での利用(結果の再利用)

関数の戻り値や計算結果を判定し、その値をifブロックの中でも使いたい場合、代入式を使うとコードを簡潔に記述できます。

従来の方法

一度変数に代入してから、その変数を条件式で判定する必要があります。

input_text = "Python Programming"
text_length = len(input_text)

if text_length > 10:
    print(f"テキストが長すぎます。文字数: {text_length}")

代入式を使った方法

条件式の中で代入を行うことで、変数の定義と判定を1行にまとめることができます。

input_text = "Python Programming"

# len(input_text) の結果を n に代入しつつ、n > 10 を判定
if (n := len(input_text)) > 10:
    print(f"テキストが長すぎます。文字数: {n}")

変数 n のスコープ(有効範囲)は if 文の外にも及ぶため、以降の処理でも n を使用可能です。

活用例2:while 文での利用(ループ条件の簡略化)

ユーザー入力の受け取りや、ファイルからのデータ読み込みなど、「値を取得して、特定の条件でなければ処理を続ける」というパターンで非常に有効です。

従来の方法

ループの前とループの中で、同じ処理(input()など)を2回書くか、無限ループと break を組み合わせる必要がありました。

# 無限ループを使った例
while True:
    command = input("コマンドを入力 (qで終了): ")
    if command == 'q':
        break
    print(f"入力されたコマンド: {command}")

代入式を使った方法

while の条件式の中で値の取得と判定を同時に行えるため、コードの重複を排除できます。

# 代入式を使用
# command に入力を代入し、その値が 'q' でなければループ継続
while (command := input("コマンドを入力 (qで終了): ")) != 'q':
    print(f"入力されたコマンド: {command}")

活用例3:リスト内包表記での利用(計算コストの削減)

リスト内包表記の中で、「計算結果に基づいてフィルタリングし、その結果をリストに格納したい」という場合、代入式を使うことで同一の計算を2回行う無駄を省けます。

例:重い計算処理の結果を利用する場合

ここでは数値計算を行う関数 calculate_heavy_value を想定します。

import math

def calculate_heavy_value(num):
    """何らかの計算処理(例: 3乗して平方根をとる)"""
    return math.sqrt(num ** 3)

source_data = range(10)

# 従来の方法(計算が2回走るため非効率)
# result_list = [calculate_heavy_value(x) for x in source_data if calculate_heavy_value(x) > 5]

# 代入式を使った方法
# 1. val = calculate_heavy_value(x) を実行
# 2. val > 5 を判定
# 3. 条件を満たせば val をリストに追加
result_list = [val for x in source_data if (val := calculate_heavy_value(x)) > 5.0]

print(f"結果リスト: {result_list}")

実行結果:

結果リスト: [5.196152422706632, 8.0, 11.180339887498949, ...(省略)]

このように、if 句の中で計算した結果を変数 val に保持し、それをリストの要素として利用することで、関数呼び出しの回数を半減させることができます。

まとめ

  • 代入式(セイウチ演算子 :=)は、式の中で変数への代入を行う機能です。
  • if 文や while 文の条件式内で値を取得・保持する際に、コードの行数を減らし可読性を向上させます。
  • リスト内包表記では、重複する計算処理をまとめることでパフォーマンスの向上に寄与します。
  • 複雑な式の中で多用しすぎると逆に可読性が下がるため、適切な場面で使用することが重要です。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次