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 ドキュメント