我在某人的代码中看到了这个:
y = img_index // num_images
Run Code Online (Sandbox Code Playgroud)
img_index
运行索引在哪里,num_images
是3.
当我//
在IPython中乱搞时,它似乎就像一个分裂符号(即一个正斜杠).我只是想知道是否有任何理由让双正斜杠?
Mar*_*off 474
在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
Run Code Online (Sandbox Code Playgroud)
在Python 3中:
>>> 10/3
3.3333333333333335
>>> 10//3
3
Run Code Online (Sandbox Code Playgroud)
有关进一步参考,请参阅PEP238.
Ale*_*lli 159
//
是无条件的"地板部门",例如:
>>> 4.0//1.5
2.0
Run Code Online (Sandbox Code Playgroud)
如你所见,即使两个操作数都是float
s,//
仍然是地板 - 所以你总能安全地知道它将要做什么.
单个/
可能会或可能不会取决于Python版本,未来的导入,甚至是Python运行的标志,例如......:
$ python2.6 -Qold -c 'print 2/3'
0
$ python2.6 -Qnew -c 'print 2/3'
0.666666666667
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,单个/
可能会下楼,或者它可能会根据完全非本地问题返回浮动,最多包括-Q
标志的值...... ;-).
所以,如果你知道你想要地板,总是使用//
,这保证了它.如果您知道自己不想要地板,请float()
在其他操作数周围拍打并使用/
.任何其他组合,你受版本,导入和标志的摆布! - )
Eri*_*got 21
为了补充Alex的回应,我想补充一点,从Python 2.2.0a2开始,from __future__ import division
是使用大量的方便的替代方法float(…)/…
. 所有部门都执行浮动划分,除了那些划分//
.这适用于2.2.0a2上的所有版本.
use*_*083 16
为了补充这些其他答案,//
运营商还提供了显着的(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
Run Code Online (Sandbox Code Playgroud)
//
可以被认为是math.floor()的别名,用于返回值为type的分区float
.它的操作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
Run Code Online (Sandbox Code Playgroud)