#
6 二項算術演算 (binary arithmetic operation)

二項算術演算は、慣習的な優先順位を踏襲しています。 演算子のいずれかは、特定の非数値型にも適用されるので注意して ください。べき乗 (power) 演算子を除き、演算子には二つのレベル、 すなわち乗算的 (multiplicatie) 演算子と加算的 (additie) 演算子 しかありません:

  m_expr | ::= | u_expr | m_expr "*" u_expr | m_expr "//" u_expr | m_expr "/" u_expr
  |  | `| m_expr "%" u_expr`
  a_expr | ::= | m_expr | a_expr "+" m_expr | a_expr "-" m_expr

  Download entire grammar as text.

`*` (乗算: multiplication) 演算は、引数間の積になります。 引数の組は、双方ともに数値型であるか、片方が整数 (通常の整数または 長整数) 型で他方がシーケンス型かのどちらかでなければなりません。 前者の場合、数値は共通の型に変換された後乗算されます。 後者の場合、シーケンスの繰り返し操作が行われます。繰り返し数を負に すると、空のシーケンスになります。

`/` (除算: division) および `//` (切り捨て除算: floor division) は、引数間の商になります。数値引数はまず共通の型に変換されます。 整数または長整数の除算結果は、同じ型の整数になります; この場合、 結果は数学的な除算に関数 `floor' を適用したものになります。 ゼロによる除算を行うと `ZeroDivisionError` 例外を送出 します。

`%` (モジュロ: modulo) 演算は、第一引数を第二引数で除算 したときの剰余になります。数値引数はまず共通の型に変換されます。 右引数値がゼロの場合には、`ZeroDivisionError` 例外が 送出されます。引数値は浮動小数点でもよく。例えば `3.14%0.7` は `0.34` になります (`3.14` は `4*0.7 + 0.34` だからです)。モジュロ演算子は常に第二引数と同じ符号 (またはゼロ) の結果になります; モジュロ演算の結果の絶対値は、常に第二引数 の絶対値よりも小さくなります。5

整数による除算演算やモジュロ演算は、恒等式: `x == (x/y)*y + (x%y)` と関係しています。整数除算や モジュロはまた、組み込み関数 `divmod()`: `divmod(x, y) == (x/y, x%y)` と関係しています。 これらの恒等関係は浮動小数点の場合には維持されません; `x/y` が `floor(x/y)` や `floor(x/y) - 1` に 置き換えられた場合、これらの恒等式は近似性を維持します。 6

リリース 2.3 で撤廃されました。 切り捨て除算演算子、モジュロ演算子、および `divmod()` 関数は、複素数に対してはもはや定義されて いません。目的に合うならば、代わりに `abs()` を使って 浮動小数点に変換してください。

`+` (加算) 演算は、引数を加算した値を返します。 引数は双方とも数値型か、双方とも同じ型のシーケンスでなければなりません。 前者の場合、数値は共通の型に変換され、加算されます。 後者の場合、シーケンスは結合 (concatenate) されます。

`-` (減算) 演算は、引数間で減算を行った値を返します。 数値引数はまず共通の型に変換されます。

#### Footnotes

... の絶対値よりも小さくなります。5
  `abs(x%y) < abs(y)` は数学的には真となりますが、浮動小数点 に対する演算の場合には、値丸め (roundoff) のために数値計算的に 真にならない場合があります。例えば、Python の浮動小数点型が IEEE754 倍精度数型になっているプラットフォームを仮定すると、 `-1e-100 % 1e100` は `1e100` と同じ符号になるはず なのに、計算結果は `-1e-100 + 1e100` となります。これは 数値計算的には厳密に `1e100` と等価です。`math` モジュールの関数 `fmod()` は、最初の引数と符号が一致する ような値を返すので、上記の場合には `-1e-100` を返します。 どちらのアプローチが適切かは、アプリケーションに依存します。
... 置き換えられた場合、これらの恒等式は近似性を維持します。6
  x が y の整数倍に非常に近い場合、丸め誤差によって `floor(x/y)` は `(x-x%y)/y` よりも大きな値になる可能性があります。 そのような場合、 Python は`divmod(x,y)[0] * y + x % y` が `x` に非常に近くなるという関係を保つために、後者の値を 返します。