Pythonの//演算子を使って整数の商と余りを計算する方法

スポンサーリンク

Python 3 の // 演算子は、フロアベースの除算を行うために使用されます。

これは、 a // b が最初に a を b で割って整数の商を得、余りを捨てることを意味します。

つまり、 a//b の結果は常に整数になります。

スポンサーリンク

Python // 演算子の例

以下は、同じことを説明するためのいくつかの例です。

>>> 2 // 3
0
>>> 1.3 // 2
0.0
>>> 1.3 // 1.0
1.0
>>> 3.4 // 1.1
3.0
>>> 3.4 // 1.2
2.0
>>> -1//2
-1
>>> -6 // 2
-3
>>> -6 // -3
2

これは、// 演算子が、浮動小数点数であっても整数部分のみを考慮したフロアベースの除算を行うことを示しています。

サポートされていない型 (リストや文字列など) に対してこの演算を行うと、他の算術演算子と同様に TypeError が発生します。

// 演算子をオーバーロードする

デフォルトでは //__floordiv__() 演算子を参照するので、このメソッド (operator.__floordiv__(a, b)) をオーバーライドすれば演算子のオーバーロードを行うことができます。

ここでは、同じ長さの整数リストに対して // メソッドをオーバーロードして、要素のペアごとにフロアベースの除算を実行する例を示します。

つまり、2つの整数リスト [3, 4, 5][2, 2, 1][3//2, 4//2, 5//1] となり、これは単にリスト [1, 2, 5] と同じです。

import operator
 
class MyClass():
    def __init__(self, a):
        self.a = a
 
    def __floordiv__(self, b):
        if isinstance(self.a, list) and isinstance(b.a, list) and len(self.a) == len(b.a):
            result = []
            # Overload // operator for Integer lists
            for i, j in zip(self.a, b.a):
                result.append(i // j)
            return result
        else:
            # Perform Default // operation otherwise
            return operator.__floordiv__(self.a, b.a)
 
m = MyClass([3, 4, 5])
n = MyClass([2, 2, 1])
 
print(m // n)

結果は以下の通りです。

[1, 2, 5]

まとめ

この記事では、床分割演算子 // について学びました。

また、 operator.__floordiv__(a, b) を実装することで、この演算子のオーバーロードを行うことを学びました。

参考文献

  • Python Operator ドキュメント
タイトルとURLをコピーしました