2009-10-08 10 views
254

私が誰かのコードでこれを見た:私はIPythonで//と周りの混乱、それだけで除算記号のように振る舞うように見えるときimg_indexは、ランニングインデックスとnum_imagesあるPythonで '//'を使用する理由は何ですか?

y = img_index // num_images 

は(3

です1つのスラッシュ)。私は二重のスラッシュを持つ理由があるかどうか疑問に思っていただけですか?

答えて

318

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を参照。

+13

より良い私実際にこのスタイルのような...私は私が使用した少なくとも1つの言語で(VB?)を覚えることができる差別化要因は、 '/' '\'対だった...しかし、私は覚えていることができませんでしたどちらだった! –

+2

PEPはバックスラッシュがエスケープ文字やエスケープ改行のために予約されているので、直ちに '\'を演算子として取り除くこともできます。 –

+0

ありがとう、私はかなり長い間Python 3+で忙しかったし、これを新しくすることはありません。私はいつも 'int(n/i)'をやっています。素晴らしい情報はここ! – Hidde

122

//は例えば、無条件に「フローリング部門」である:

>>> 4.0//1.5 
2.0 

ご覧のとおり、両方のオペランドがfloat秒、//まだ床であっても - あなたはいつもそれがつもりがそうだしっかりと知っているので。

シングル/ ... Pythonのリリース、将来の輸入、さらにはフラグPythonの実行時に、例えば依存してもしなくてもよい床の可能性があります、

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

あなたが見るように、単一の/月の床、完全に非ローカルの問題に基づいて、-Qフラグの値を含むfloatを返すかもしれません... ;-)。だから、

、もし、あなたがそれを保証フローリング、常に使用//を、欲しい知っを知っていて、フロアリングが必要ない場合は、float()を他のオペランドの周りに置き、/を使用してください。 -

+8

興味深いことに、切り捨てる//浮動小数点を返します。 – Lucretiel

+0

//演算子は、切り捨て/切り捨て除算ではなく、フロア区切りを行います。 –

+0

これは、この質問の性質に基づいたより直接的な答えです。答えが高くなると便利ですが、これはPython2で1つを選択する理由を明確にしています。 –

20

アレックスの対応を補完するために、Python 2.2.0a2から始めると、from __future__ import divisionはたくさんのを使用するのに便利な代替手段ですfloat(…)/…のものを除き、すべて部門はfloat部門を実行します。これは2.2.0a2のすべてのバージョンで動作します。

7

//は、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 
13

これらの他の回答を補完するために、//オペレータはまた、整数の除算をしたい仮定し、/上で重要な(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 
関連する問題