さつまろぐ

CAEとかプログラムとか、出来たことの記録など、誰かのお役に立てれば幸い。

Pythonで遊ぶ 特殊な代入

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'

以上

広告