在Python中使用'//'的原因是什么?

时间:2009-10-08 04:15:37

标签: python division

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

y = img_index // num_images

其中img_index是一个正在运行的索引,num_images是3。

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

5 个答案:

答案 0 :(得分:430)

在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

答案 1 :(得分:150)

//无条件地“地板划分”,例如:

>>> 4.0//1.5
2.0

如您所见,即使两个操作数都是float s,// 仍然是层 - 所以您始终可以确切地知道它将要做什么。

/可能会或可能不会下降,具体取决于Python版本,未来的导入,甚至是Python运行的标志,例如....:

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

如您所见,单个/可能会触底,它可能会根据完全非本地问题返回一个浮点数,最多包括{{1}的值} flag ...; - )。

所以,如果你知道你想要地板,总是使用-Q,这保证了它。如果您知道想要地板,请在其他操作数周围拍打//并使用float()。任何其他组合,你都受版本,导入和标志的支配! - )

答案 2 :(得分:21)

为了补充Alex的回应,我想补充一点,从Python 2.2.0a2开始,from __future__ import division是使用大量float(…)/…的一种方便的替代方法。 所有分区执行 float 分区,但//除外。这适用于2.2.0a2上的所有版本。

答案 3 :(得分:14)

为了补充这些其他答案,//运算符还提供了超过/的显着(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

答案 4 :(得分:8)

对于返回值类型为//的分区,

float可以被视为math.floor()的别名。对于返回值类型为no-op的分部,它的作用为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