482

我在某人的代码中看到了这一点:

y = img_index // num_images

其中img_index是运行指数,num_images为 3。

当我//IPython中乱用时,它似乎就像一个除号(即一个正斜杠)。我只是想知道是否有任何理由有双斜杠?

4

5 回答 5

613

在 Python 3 中,他们使/运算符进行浮点除法,并添加//运算符进行整数除法(即无余数的商);而在 Python 2 中,/运算符只是整数除法,除非其中一个操作数已经是浮点数。

在 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,// 仍然是楼层——所以你总是可以安全地知道它会做什么。

Single/可能会也可能不会取决于 Python 版本、未来的导入,甚至 Python 运行的标志,例如:

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

如您所见,基于完全非本地问题,single/可能会落地,或者-Q它可能会返回一个浮点数,直到并包括标志的值......;-)。

因此,如果您知道自己想要地板,请始终使用//,这可以保证。如果并且当您知道您想要地板时,请float()在其他操作数周围拍打 a 并使用/. 任何其他组合,您都受版本、导入和标志的支配!-)

于 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 回答
10

//对于返回值为 type 的除法,可以认为是 math.floor() 的别名float。它的操作no-op与返回值为 type 的部门一样int

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
于 2014-09-22T00:28:07.840 回答