在Python中拥有“//”的原因是什么?

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

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的, // 仍然是地板 – 所以你总是知道它会做什么。

单一/可能或不可能发布,取决于Python发行版,未来的导入,甚至Python运行的标志,例如…:

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

正如你所看到的,单一的/可能的楼层, 或者它可能会返回一个浮动,基于完全非本地的问题,直到并包括-Q标志的值… ;-)。

所以,如果当你知道你想要地板, 总是使用// ,这保证了它。 如果当你知道你想要地板时,在其他操作数的周围打一个float()并使用/ 。 任何其他的组合,你是版本,import和标志的摆布! – )

为了补充Alex的回应,我会补充说,从Python 2.2.0a2开始, from __future__ import division是一个方便的替代使用大量的float(…)/… 所有部门执行浮动划分,除了那些与/ /。 这适用于2.2.0a2以上的所有版本。

为了补充这些其他答案, //运算符还提供了相当大的(3x)性能优势,假设您需要整数除法。

 $ 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 

//可以被认为是math.floor()的别名,返回值types为float 。 它对于返回值types为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