我在某人的代码中看到:
y = img_index // num_images
其中img_index是一个运行索引,num_images是3。
img_index
num_images
当我在IPython中乱动//时,它似乎就像一个除号(即一个正斜杠)。我只是想知道是否有任何理由使用双斜杠?
//
在Python 3中,他们让/操作符做浮点除法,并添加//操作符来做整数除法(即,无余数的商);而在python2中,/操作符只是整数除法,除非其中一个操作数已经是浮点数。
/
在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
正如你所看到的,即使两个操作数都是__abc0, // 仍然层——所以你总是安全地知道它要做什么。
单个/可能会也可能不会落底,这取决于Python版本、未来的导入,甚至是Python运行的标志,例如:
$ python2.6 -Qold -c 'print 2/3' 0 $ python2.6 -Qnew -c 'print 2/3' 0.666666666667
如你所见,单个/可能会floor, 或可能会返回一个浮点数,基于完全非本地的问题,直到并包括-Q标志的值…;-)。
-Q
因此,如果并且当你知道你想要地板,总是使用//,这保证了它。如果并且当你知道不需要地板时,在其他操作数周围加上float()并使用/。任何其他组合,你都要受版本、导入和标志的摆布!-)
float()
为了补充亚历克斯的反应,我要补充的是,从Python 2.2.0a2开始,from __future__ import division是使用大量float(…)/…的方便替代方案。所有除法执行浮动除法,除了那些带有//的除法。这适用于2.2.0a2以上的所有版本。
from __future__ import division
float(…)/…
//可以被认为是math.floor()的别名,用于返回值类型为float的除法。对于返回值类型为int的除法,它的操作方式为no-op。
float
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
为了补充这些其他答案,//操作符还提供了比/显著的(3x)性能优势,假设你想要整数除法。
$ 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