在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