web-dev-qa-db-ja.com

Pythonで '//'を使用する理由は何ですか?

私はこれを誰かのコードで見ました:

y = img_index // num_images

img_indexは実行中のインデックス、num_imagesは3です。

IPythonで//をめちゃくちゃにすると、それは除算記号(つまり1つのスラッシュ)のように振る舞うようです。二重スラッシュを使用する理由があるかどうか、私は疑問に思いましたか?

354
Pete

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 を参照してください。

435
Mark Rushakoff

//は無条件に「フローリング部門」です。

>>> 4.0//1.5
2.0

ご覧のように、両方のオペランドがfloatsであっても、//はまだフロアなので、それが何をしているのかを常に確実に知っています。

単一の/は、Pythonのリリース、将来のインポート、さらにはPythonが動作するフラグにもよりますが、下限になる場合もあれば、そうでない場合もあります。

$ python2.6 -Qold -c 'print 2/3'
0
$ python2.6 -Qnew -c 'print 2/3'
0.666666666667

ご覧のとおり、単一の/は下限になる可能性があり、またはは完全に非局所的な問題に基づいて、-Qフラグの値までのfloatを返すことがあります。 ;-).

だから、もしあなたがknowであなたがフローリングを望むなら、常に//を使ってください。 。しないでフローリングが必要な場合は、他のオペランドの周囲にfloat()をスラップし、/を使用します。他のどのような組み合わせでも、あなたはバージョン、インポート、そしてフラグのなすがままになっています! - )

152
Alex Martelli

Alexの反応を補完するために、Python 2.2.0a2からfrom __future__ import divisionがたくさんのfloat(…)/…を使うのに代わる便利な方法であると付け加えます。 All divisionsは、//を持つものを除いて、float divisionを実行します。これは2.2.0a2以降のすべてのバージョンで動作します。

21
Eric O Lebigot

これらの他の答えを補足するために、//演算子は、整数除算が必要であると仮定して、/よりもパフォーマンスが大幅に(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
14
user3733083

//は、戻り値が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
8
un33k