Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM

Pythonのセイウチ演算子

【Python入門】セイウチ演算子「:=」の代入式の使い方の解説

Pytyonにおける「:=」演算子を使った代入式について、その基本的な考え方と使い方を解説

今回はPythonのバージョン3.8から実装された「:=」ことセイウチ演算子による代入式(Assignment Expressions)の解説となります。

公式ドキュメント

公式ドキュメント:PEP 572 – Assignment Expressions

セイウチ演算子による代入式の使い方の基本

まずセイウチ演算子を使わない次のコードを見てください。

name = "Goole"
if name:
    print(name)

if文のところでnameというオブジェクトが「式」の1つとして評価されてその実体である文字列Googleが存在していますので、Trueが返り、これらの結果、if文が実行されています。

次にセイウチ演算子による代入式(代入文ではありません)を使った次のコードを見てください。上のコードと同じ結果となります。

if name:="Google":
    print(name)

どうでしょう。

name := "Google"

この部分で、

  • 文字列Googleの「代入」
  • 「評価」(結果としてTrueが返る)

が同時に行われてることがポイントです。その結果、コードが少しだけコンパクトになっていますね。

このようにセイウチ演算子による代入式とは、その名前のとおり、

  • 代入

という2つの機能を満たす式なのです。これら2つを同時こなせる書き方がセイウチ演算子による代入式というわけですね。

セイウチ演算子が文法エラーとなるパターン

セイウチ演算子もいつでもどんな場合でも使えるわけではなく、その使い方にある程度の制約があります。上記公式ドキュメントでは、以下のようにINVALID(ダメ)、VALID(OK)の場合が例示されています。

# INVALID
x := 0

# Valid alternative
(x := 0)

# INVALID
x = y := 0

# Valid alternative
x = (y := 0)

# Valid
len(lines := f.readlines())

# Valid
foo(x := 3, cat='vector')

# INVALID
foo(cat=category := 'vector')

# Valid alternative
foo(cat=(category := 'vector'))

ただしこれらの例でVALIDとなる場合でも多くが「基本的には使わない方が良い(j非推奨)」とされています。理由は、やはりコードの見やすさや理解のしやすさが下がることが多いからです。

セイウチ演算子のメリットとは?

セイウチ演算子は「式(expression)」(プログラムによって評価された結果、なんらかの値が返るもの)の一種であり、「文(statement)」ではありません。よって、文が使えない構文でも式であるセイウチ演算子を使うことができます

文が使えない構文として典型的なものは、

  • ラムダ関数(lambda function)
  • 内包表記

といったものです。

たとえば、ラムダ関数にセイウチ演算子を使った例が次のコードです。

def fnc(x, y):
    return (z := lambda: x + y)

a = fnc(1, 2)
a()  # ==> 3

特に意味のないコードですが、この仕組みを簡単に解説しておきます。

fnc(1 ,2)によって、fnc(x, y)において x=1, y=2となる
↓
lambda: 1 + 2(これは整数「3」を返すだけの関数)
↓
そのラムダ関数がzに代入される
↓
zが評価される(結果:True)
↓
zがreturnされる(つまり、「lambda: 3」というラムダ関数が返る
↓
そのラムダ関数が、aに代入される
↓
aはラムダ「関数」なので、a()で実行できる
↓
3が表示される

このような動作になっています。