Pythonでは、a // b
整数除算がtrunc(a / b)として定義されている他のほとんどの言語とは対照的に、floor(a / b)として定義されています。a % b
=の解釈には対応する違いがありa - (a // b) * b
ます。
この理由は、Pythonの%
演算子(およびdivmod
)の定義は、一般的に他の言語の定義よりも有用であるためです。例えば:
def time_of_day(seconds_since_epoch):
minutes, seconds = divmod(seconds_since_epoch, 60)
hours, minutes = divmod(minutes, 60)
days, hours = divmod(hours, 24)
return '%02d:%02d:%02d' % (hours, minutes, seconds)
この関数を使用すると、期待どおりにをtime_of_day(12345)
返します。'03:25:45'
しかし、エポックの12345秒前は何時ですか?Pythonのの定義ではdivmod
、time_of_day(-12345)
を正しく返します'20:34:15'
。
divmod
とのC定義を使用するように再定義するとどう/
なり%
ますか?
def divmod(a, b):
q = int(a / b) # I'm using 3.x
r = a - b * q
return (q, r)
ここで、をtime_of_day(-12345)
返します'-3:-25:-45'
。これは有効な時刻ではありません。標準のPythondivmod
関数がこのように実装されている場合、負の入力を処理するための特殊なケースのコードを作成する必要があります。しかし、私の最初の例のように、フロアスタイルの分割では、それはちょうど機能します。