我在某人的代码中看到了这一点:
y = img_index // num_images
其中img_index
是运行指数,num_images
为 3。
当我//
在IPython中乱用时,它似乎就像一个除号(即一个正斜杠)。我只是想知道是否有任何理由有双斜杠?
在 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。
//
无条件是“地板师”,例如:
>>> 4.0//1.5
2.0
正如你所看到的,即使两个操作数都是float
s,//
仍然是楼层——所以你总是可以安全地知道它会做什么。
Single/
可能会也可能不会取决于 Python 版本、未来的导入,甚至 Python 运行的标志,例如:
$ python2.6 -Qold -c 'print 2/3'
0
$ python2.6 -Qnew -c 'print 2/3'
0.666666666667
如您所见,基于完全非本地问题,single/
可能会落地,或者-Q
它可能会返回一个浮点数,直到并包括标志的值......;-)。
因此,如果您知道自己想要地板,请始终使用//
,这可以保证。如果并且当您知道您不想要地板时,请float()
在其他操作数周围拍打 a 并使用/
. 任何其他组合,您都受版本、导入和标志的支配!-)
为了补充这些其他答案,假设您想要整数除法,//
运算符还提供显着(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
//
对于返回值为 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