Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
今回は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"
この部分で、
が同時に行われてることがポイントです。その結果、コードが少しだけコンパクトになっていますね。
このようにセイウチ演算子による代入式とは、その名前のとおり、
という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)」ではありません。よって、文が使えない構文でも式であるセイウチ演算子を使うことができます。
文が使えない構文として典型的なものは、
といったものです。
たとえば、ラムダ関数にセイウチ演算子を使った例が次のコードです。
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が表示される
このような動作になっています。