二項算術演算は、慣習的な優先順位を踏襲しています。 演算子のいずれかは、特定の非数値型にも適用されるので注意して ください。べき乗 (power) 演算子を除き、演算子には二つのレベル、 すなわち乗算的 (multiplicatie) 演算子と加算的 (additie) 演算子 しかありません:
*
(乗算: multiplication) 演算は、引数間の積になります。
引数の組は、双方ともに数値型であるか、片方が整数 (通常の整数または
長整数) 型で他方がシーケンス型かのどちらかでなければなりません。
前者の場合、数値は共通の型に変換された後乗算されます。
後者の場合、シーケンスの繰り返し操作が行われます。繰り返し数を負に
すると、空のシーケンスになります。
/
(除算: division) および //
(切り捨て除算: floor division)
は、引数間の商になります。数値引数はまず共通の型に変換されます。
整数または長整数の除算結果は、同じ型の整数になります; この場合、
結果は数学的な除算に関数 `floor' を適用したものになります。
ゼロによる除算を行うと ZeroDivisionError 例外を送出
します。
%
(モジュロ: modulo) 演算は、第一引数を第二引数で除算
したときの剰余になります。数値引数はまず共通の型に変換されます。
右引数値がゼロの場合には、ZeroDivisionError 例外が
送出されます。引数値は浮動小数点でもよく。例えば 3.14%0.7
は 0.34
になります (3.14
は 4*0.7 + 0.34
だからです)。モジュロ演算子は常に第二引数と同じ符号 (またはゼロ)
の結果になります; モジュロ演算の結果の絶対値は、常に第二引数
の絶対値よりも小さくなります。5.2
整数による除算演算やモジュロ演算は、恒等式:
x == (x/y)*y + (x%y)
と関係しています。整数除算や
モジュロはまた、組み込み関数 divmod():
divmod(x, y) == (x/y, x%y)
と関係しています。
これらの恒等関係は浮動小数点の場合には維持されません;
x/y
が floor(x/y)
や floor(x/y) - 1
に
置き換えられた場合、これらの恒等式は近似性を維持します。
5.3
+
(加算) 演算は、引数を加算した値を返します。
引数は双方とも数値型か、双方とも同じ型のシーケンスでなければなりません。
前者の場合、数値は共通の型に変換され、加算されます。
後者の場合、シーケンスは結合 (concatenate) されます。
-
(減算) 演算は、引数間で減算を行った値を返します。
数値引数はまず共通の型に変換されます。
abs(x%y) < abs(y)
は数学的には真となりますが、浮動小数点
に対する演算の場合には、値丸め (roundoff) のために数値計算的に
真にならない場合があります。例えば、Python の浮動小数点型が
IEEE754 倍精度数型になっているプラットフォームを仮定すると、
-1e-100 % 1e100
は 1e100
と同じ符号になるはず
なのに、計算結果は -1e-100 + 1e100
となります。これは
数値計算的には厳密に 1e100
と等価です。math
モジュールの関数 fmod() は、最初の引数と符号が一致する
ような値を返すので、上記の場合には -1e-100
を返します。
どちらのアプローチが適切かは、アプリケーションに依存します。
floor(x/y)
は (x-x%y)/y
よりも大きな値になる可能性があります。
そのような場合、 Python はdivmod(x,y)[0] * y + x % y
が x
に非常に近くなるという関係を保つために、後者の値を
返します。