私はこれを誰かのコードで見ました:
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
フラグの値までのfloatを返すことがあります。 ;-).
だから、もしあなたがknowであなたがフローリングを望むなら、常に//
を使ってください。 。しないでフローリングが必要な場合は、他のオペランドの周囲にfloat()
をスラップし、/
を使用します。他のどのような組み合わせでも、あなたはバージョン、インポート、そしてフラグのなすがままになっています! - )
Alexの反応を補完するために、Python 2.2.0a2からfrom __future__ import division
がたくさんのfloat(…)/…
を使うのに代わる便利な方法であると付け加えます。 All divisionsは、//
を持つものを除いて、float divisionを実行します。これは2.2.0a2以降のすべてのバージョンで動作します。
これらの他の答えを補足するために、//
演算子は、整数除算が必要であると仮定して、/
よりもパフォーマンスが大幅に(3倍)向上しています。
$ python -m timeit '20.5 // 2'
100000000 loops, best of 3: 0.0149 usec per loop
$ python -m timeit '20.5 / 2'
10000000 loops, best of 3: 0.0484 usec per loop
$ python -m timeit '20 / 2'
10000000 loops, best of 3: 0.043 usec per loop
$ python -m timeit '20 // 2'
100000000 loops, best of 3: 0.0144 usec per loop
//
は、戻り値がfloat
型の除算に対して、math.floor()の別名と見なすことができます。戻り値がint
型の部門の場合、no-op
として機能します。
import math
# let's examine `float` returns
# -------------------------------------
# divide
>>> 1.0 / 2
0.5
# divide and round down
>>> math.floor(1.0/2)
0.0
# divide and round down
>>> 1.0 // 2
0.0
# now let's examine `integer` returns
# -------------------------------------
>>> 1/2
0
>>> 1//2
0