私は誰かのコードでこれを見ました:
y = img_index // num_images
はimg_index
実行中のインデックスで、num_images
3 です。
IPythonをいじると//
、除算記号 (つまり、1 つのスラッシュ) のように振る舞うように見えます。二重のスラッシュを使用する理由があるかどうか疑問に思っていましたか?
Python 3 では、/
演算子に浮動小数点除算//
を行わせ、整数除算 (つまり、余りのない商) を行う演算子を追加しました。一方、Python 2 では、/
オペランドの 1 つがすでに浮動小数点数でない限り、演算子は単純な整数除算でした。
Python 2.X の場合:
>>> 10/3
3
>>> # To get a floating point number from integer division:
>>> 10.0/3
3.3333333333333335
>>> float(10)/3
3.3333333333333335
Python 3 では:
>>> 10/3
3.3333333333333335
>>> 10//3
3
詳細については、 PEP238を参照してください。
//
無条件に「フロア分割」です。例:
>>> 4.0//1.5
2.0
ご覧のように、両方のオペランドがfloat
s であるにもかかわらず、//
まだ階数です。したがって、それが何をしようとしているのかを常に確実に知ることができます。
シングル/
は、Python のリリース、将来のインポート、さらには Python が実行されるフラグに応じてフロアになる場合とフロアにならない場合があります。
$ python2.6 -Qold -c 'print 2/3'
0
$ python2.6 -Qnew -c 'print 2/3'
0.666666666667
ご覧のとおり、フラグの値を含めて、完全にローカルではない問題に基づいて、単一の/
場合はフロアになるか、フロートを返す場合があります...;-)。-Q
したがって、フローリングが必要であることがわかっている場合は、常に//
それを保証する を使用してください。フローリングが不要であることがわかっている場合は、他のオペランドを a で囲み、を使用float()
します/
。他の組み合わせでは、バージョン、インポート、およびフラグに翻弄されます!-)
これらの他の回答を補完するために、演算子は、整数除算が必要であると仮定して、 より//
も大幅な (3 倍の) パフォーマンス上の利点も提供します。/
$ python -m timeit '20.5 // 2'
100,000,000 loops, best of 3: 14.9 nsec per loop
$ python -m timeit '20.5 / 2'
10,000,000 loops, best of 3: 48.4 nsec per loop
$ python -m timeit '20 / 2'
10,000,000 loops, best of 3: 43.0 nsec per loop
$ python -m timeit '20 // 2'
100,000,000 loops, best of 3: 14.4 nsec per loop