我在某人的代码中看到了这一点:
y = img_index // num_images
其中img_index
是一个正在运行的索引,num_images
是3。
当我在IPython中使用//
时,它似乎就像一个分裂符号(即一个正斜杠)。我只是想知道是否有任何理由让双正斜杠?
答案 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