482

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

y = img_index // num_images

img_index実行中のインデックスで、num_images3 です。

IPythonをいじると//、除算記号 (つまり、1 つのスラッシュ) のように振る舞うように見えます。二重のスラッシュを使用する理由があるかどうか疑問に思っていましたか?

4

5 に答える 5

613

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

于 2009-10-08T04:17:49.270 に答える
215

//無条件に「フロア分割」です。例:

>>> 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

したがって、フローリングが必要であることがわかっている場合は、常に//それを保証する を使用してください。フローリングが不要であることがわかっている場合は、他のオペランドを a で囲み、使用float()します/。他の組み合わせでは、バージョン、インポート、およびフラグに翻弄されます!-)

于 2009-10-08T04:28:53.273 に答える
27

これらの他の回答を補完するために、演算子は、整数除算が必要であると仮定して、 より//も大幅な (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
于 2015-02-20T06:35:46.700 に答える
23
于 2009-10-08T07:37:56.583 に答える