【Python】数値演算の優先順位

python_logo

今回は、Pythonの数値の演算の優先順位についてまとめたいと思います。

とりあえず、公式サイトからPython3.7時点では以下のようになっています。

下に行くほど優先順位が高いです。

演算 結果
x + yx と y の和
x – yx と y の差
x * yx と y の積
x / yx と y の商
x // yx と y の商の整数部
x % yx / y の剰余
-xx の符号反転
+xx そのまま
abs(x)x の絶対値
int(x)x の整数への変換
float(x)x の浮動小数点数への変換
complex(re, im)実部 re, 虚部 im の複素数。 im の既定値はゼロ。
c.conjugate() 複素数 c の共役複素数
divmod(x, y)(x // y, x % y) からなるペア
pow(x, y)x の y 乗
x ** yx の y 乗

Tips・ 注意点

Pythonでは型の異なる数値型同士の演算を完全にサポートしています。

より複雑な型に合わせて計算してくれます。

つまり、整数型 + 浮動小数点数型なら値として浮動小数点数が返ってきます。

浮動小数点数型と複素数型なら値として複素数型が返ってきます。

/の仕様変更及び//の追加

Python2.2で//が追加されています。

//は商の整数部を返しますが、これは元々/の仕様でした。

/がPython2で問題だったのは、整数で使った場合と浮動小数点数で使った場合で戻ってくる型が異なっていたことです。

整数同士に対して/を用いると切り捨てられた商が返ってきます。一方で、浮動小数点数が含まれると小数点以下も含まれて返ってきました(つまり、浮動小数点数として返ってきました)。

Python3でその役割が/と//で完全に分離されたのです。

以下を参考にしてください

PEP 238: 除算演算子を変更していく

intとlongの統一

Python3以前は整数型には2種類存在していました。

長整数と呼ばれる整数があったのです。

これは整数の後ろにLをつけることで任意のサイズの値が格納できました(intは32ビット)。

Python初期のころはこの仕様によって色々な箇所で不具合があったようです。

Python2.2で必要に応じて、自動的にintをlongに変換するようになりました。

この先のPython2.4ではLを使うと警告がでるようになり、Python3で消えました。

という背景が実はあります。気になる方は以下を参照してください。

PEP 237: 長整数と整数を一体化していく

まとめ

いかがだったでしょうか

優先順位は覚える必要はありませんが、時々確認したいときに便利なのでまとめました。

実際は複雑になれば括弧でくくって読み手に分かりやすくしますので、絶対覚えるべきものでは有りません。

あと今回は関数には触れていません。

また関数に関しての記事を書き次第、修正したいと思います。

それでは以上になります!ありがとうございました。