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