Python中'//'的作用是什么?
我在某人的代码中看到了这个:
y = img_index // num_images
这里的 img_index
是一个正在运行的索引,而 num_images
是 3。
当我在 IPython 中玩弄 //
时,它似乎和一个普通的除号(也就是一个斜杠)表现得一样。我只是想知道,为什么要用两个斜杠呢?
5 个回答
27
为了补充其他的回答,//
这个运算符在进行整数除法时,性能上比 /
提高了三倍。
$ python -m timeit '20.5 // 2'
100,000,000 loops, best of 3: 14.9 nsec per loop
$ python -m timeit '20.5 / 2'
10,000,000 loops, best of 3: 48.4 nsec per loop
$ python -m timeit '20 / 2'
10,000,000 loops, best of 3: 43.0 nsec per loop
$ python -m timeit '20 // 2'
100,000,000 loops, best of 3: 14.4 nsec per loop
219
//
是一种无条件的“向下取整除法”,比如:
>>> 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()
,然后使用 /
。其他任何组合,你就得看版本、导入和标志的情况了!-)
639
在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。