概要
Pythonの複合代入演算子を使い、変数の値を更新する書き方を整理する。
複合代入演算子は、`x = x + 1`のような更新処理を`x += 1`のように短く書くための記法となる。
ここでは、加算、減算、乗算、除算、剰余、べき乗の複合代入を、通常の代入との対応で確認する。
この記事の構成
- 複合代入演算子の種類
複合代入演算子の種類と各項目の特徴を整理。 - 加算(+=)・減算(-=)
加算(+=)・減算(-=)の意味と要点を具体例から整理。 - 乗算(*=)・除算(/=・//=)・剰余(%=)
乗算(*=)・除算(/=・//=)・剰余(%=)の意味と要点を具体例から整理。 - べき乗(**=)
べき乗(**=)の意味と要点を具体例から整理。
各複合代入演算子の使い方と実装サンプル
複合代入演算子の種類
代入演算子には、一般的な右辺から左辺へ代入する代入演算子(=)と右辺から左辺へ算術演算子を添えて代入する複合代入演算子(+=, -=など)がある。
- 複合代入演算子一覧
演算子 使用例 説明 += a += b a に b を加算し、結果を a に代入。 -= a -= b a から b を減算し、結果を a に代入。 *= a *= b a に b を乗算し、結果を a に代入。 /= a /= b a を b で除算し、結果を a に代入。 //= a //= b a を b で切り下げ除算し、結果を a に代入。 %= a %= b a を b で割った剰余を a に代入。 **= a **= b a の b 乗を a に代入。
a += bはa = a + bに近い計算だが、完全に同一ではない。複合代入は左辺を一度だけ評価し、型が対応していれば同じオブジェクトをその場で変更する。この違いはlistなどのミュータブルな型や、添字・属性を左辺にした場合に現れる。
以降、実装サンプルを対話モード(インタプリタ)で解説する。
※ int型は任意精度であり、float型とcomplex型の有限値の範囲は実装環境の浮動小数点形式に依存する。詳しくは下記を参考。
- Python - 組込みデータ型まとめ : bool , int, float, complex > int型 : 数値(整数)
- Python - 組込みデータ型まとめ : bool , int, float, complex > float型 : 浮動小数点数型
- Python - 組込みデータ型まとめ : bool , int, float, complex > complex型 : 複素数型
加算(+=)・減算(-=)
-
加算(+=)
※ 数値型ではa = a + bに近い結果となるが、複合代入は左辺を一度だけ評価する。$ python >>> # int型の 2 に 3 を加算複合代入 >>> int_a = 2 >>> int_a += 3 >>> print(int_a) 5 >>> # float型の 3.5 に 3.6 を加算複合代入 >>> float_a = 3.5 >>> float_a += 3.6 >>> print(float_a) 7.1 >>> # complex型の 4 + 4j に 5 + 5j を加算複合代入 >>> complex_a = 4 + 4j >>> complex_a += 5 + 5j >>> print(complex_a) (9+9j) >>> -
減算(-=)
※ a = a - b と同義(簡略表記したもの)$ python >>> # int型の 5 に 3 を減算複合代入 >>> int_a = 5 >>> int_a -= 3 >>> print(int_a) 2 >>> # float型の 5.0 に -5.9 を減算複合代入 >>> float_a = 5.0 >>> float_a -= -5.9 >>> print(float_a) 10.9 >>> # complex型の 5 + 5j に 10 - 10j を減算複合代入 >>> complex_a = 5 + 5j >>> complex_a -= 10 - 10j >>> print(complex_a) (-5+15j) >>>
乗算(*=)・除算(/=・//=)・剰余(%=)
-
乗算(*=)
※ a = a * b と同義(簡略表記したもの)$ python >>> # int型の 2 に 3 を乗算複合代入 >>> int_a = 2 >>> int_a *= 3 >>> print(int_a) 6 >>> # float型の 2.5 に -3.0 を乗算複合代入 >>> float_a = 2.5 >>> float_a *= -3.0 >>> print(float_a) -7.5 >>> # complex型の 5 + 2j に 2 - 5j を乗算複合代入 >>> complex_a = 5 + 2j >>> complex_a *= 2 - 5j >>> print(complex_a) (20-21j) >>> -
除算(/=)
※ a = a / b と同義(簡略表記したもの)$ python >>> # int型の 6 に 2 を除算複合代入 >>> int_a = 6 >>> int_a /= 2 >>> print(int_a) 3.0 >>> # float型の 5.5 に -0.5 を除算複合代入 >>> float_a = 5.5 >>> float_a /= -0.5 >>> print(float_a) -11.0 >>> # complex型の 2 + 2j に 1 + 1j を除算複合代入 >>> complex_a = 2 + 2j >>> complex_a /= 1 + 1j >>> print(complex_a) (2+0j) >>> -
除算(//=) ※商のみ
※ a = a // b と同義(簡略表記したもの)$ python >>> # int型の 11 に 3 を除算(//)複合代入 >>> int_a = 11 >>> int_a //= 3 >>> print(int_a) 3 >>> # float型の 3.3 に 0.2 を除算(//)複合代入 >>> float_a = 3.3 >>> float_a //= 0.2 >>> print(float_a) 16.0 >>> # complex型の除算(//)はできない >>> complex_a = 3 + 3j >>> complex_a //= 2 + 2j Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for //: 'complex' and 'complex' >>> -
剰余(%=)
※ a = a % b と同義(簡略表記したもの)$ python >>> # int型の 9 に 2 を剰余複合代入 >>> int_a = 9 >>> int_a %= 2 >>> print(int_a) 1 >>> # float型の 6.5 に 2 を剰余複合代入 >>> float_a = 6.5 >>> float_a %= 2 >>> print(float_a) 0.5 >>> # complex型に剰余はできない >>> complex_a = 3 + 3j >>> complex_a %= 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for %: 'complex' and 'int' >>>※ 例外メッセージの文言はPythonのバージョンで変わる場合があるが、複素数に
//や%を適用するとTypeErrorになる点が重要。
べき乗(**=)
※ a = a ** b と同義(簡略表記したもの)
$ python
>>> # int型の 2 に 4 をべき乗複合代入
>>> int_a = 2
>>> int_a **= 4
>>> print(int_a)
16
>>> # float型の 2.5 に 2 をべき乗複合代入
>>> float_a = 2.5
>>> float_a **= 2
>>> print(float_a)
6.25
>>> # complex型の 2 + 2j に 2 をべき乗複合代入
>>> complex_a = 2 + 2j
>>> complex_a **= 2
>>> print(complex_a)
8j
>>>
まとめ
- 複合代入演算子は演算と代入をまとめる記法で、x += 1はx = x + 1に近い意味として読める。
- listなどのmutableな型では、複合代入によって同じオブジェクトの内容が更新される場合がある。
- 短く書けても複雑な式では読みにくくなるため、通常の代入と使い分ける。
参考文献
- 金城 俊哉(\(2018\))『現場ですぐに使える! Pythonプログラミング逆引き大全313の極意』株式会社昭和システム
- Python公式ドキュメント - 累算代入文(日本語・複合代入の公式仕様)