Pythonにはいくつか特殊な代入があるらしい。
多重代入
Pythonでは複数の変数への代入を同時に行うことができる。
>>> x, y, z = 1, 2, 3 >>> print(x, y, z) 1 2 3
これを使うと、2つ以上の変数の入れ替えが一度にできる。
>>> x, y = 1, 2 >>> print(x, y) 1 2 >>> x, y = y, x #xにyの値を、yにxの値を入れる。 >>> print(x, y) 2 1 >>> x, y, z = 1, 2, 3 >>> print(x, y, z) 1 2 3 >>> x, y, z = y, z, x #x, y, z に、y, z, xの値を入れる。 >>> print(x, y, z) 2 3 1
これは、「一連の値の列(シーケンス)を一連の変数の列にアンパックする(解いて取り出す)」という意味で 「シーケンスアンパック(sequence unpacking)」と呼ばれる。 右辺はシーケンスなので、タプルや文字列でも同じことができる。
>>> number = 1,2,3 >>> number (1, 2, 3) >>> xx, yy, zz = number >>> print(xx,yy,zz) 1 2 3 >>> aa = "aiueo" >>> aa 'aiueo' >>> v, w, x, y, z = aa >>> print(v,w,x,y,z) a i u e o
シーケンスの要素数と、左辺の変数の数が異なるとエラーとなる。
>>> x, y, z = 1, 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: not enough values to unpack (expected 3, got 2)
*
を変数の前につけると、残りの部分をすべて受け取る。
>>> moji = "aiueo" >>> a, b, *c = moji #3文字目以降をcに代入 >>> print(a,b,c) a i ['u', 'e', 'o'] >>> a, *b, c, d = moji #前から2文字目~後ろから3文字目までをbに代入 >>> print(a,b,c,d) a ['i', 'u'] e o
*
をつけた変数は常にリストになる。
連鎖代入
代入を連続すると、複数の変数を同じ値にすることができる。
>>> x = y = 1 >>> print(x,y) 1 1
これは下と同じ
>>> y = 1 >>> x = y >>> print(x, y) 1 1
累算代入
x = x + 1
と書く代わりに+=
と書くことができる。他の標準的な演算子、-
、*
、/
、%
でも同じことができる。
>>> x = 2 >>> x += 3 >>> x 5 >>> x -= 1 >>> x 4 >>> x /= 2 >>> x 2.0 >>> x %= 2 >>> x 0.0
他のデータ型でも使える。
>>> x = "aiueo" >>> x = "ai" >>> x += "ueo" >>> x *= 3 >>> x 'aiueoaiueoaiueo'
以上