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

Pet*_*ete 382 python division

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

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.

  • 我实际上更喜欢这种风格......我记得我用过的至少一种语言(VB?)差别因素是`/`vs` \`...但我永远不记得哪个是哪个! (19认同)
  • PEP还解决了反斜杠是为转义字符或转义换行符保留的事实,因此这种情况会立即消除`\`作为运算符. (3认同)
  • 谢谢,我已经忙于Python 3+很长一段时间了,我从来没有新过这个,我总是做`int(n/i)`.好消息在这里! (2认同)

Ale*_*lli 159

// 是无条件的"地板部门",例如:

>>> 4.0//1.5
2.0
Run Code Online (Sandbox Code Playgroud)

如你所见,即使两个操作数都是floats,// 仍然是地板 - 所以你总能安全地知道它将要做什么.

单个/可能会或可能不会取决于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()在其他操作数周围拍打并使用/.任何其他组合,你受版本,导入和标志的摆布! - )

  • 有趣的是,截断//仍然返回一个浮点数 (11认同)

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)

  • 我用[Python 3](https://en.wikipedia.org/wiki/History_of_Python#Version_3) (Python 3.8.5)尝试过,所有四个都以***相同的速度***运行。示例运行:每个循环 *9.24* 纳秒、*9.40*、*9.22* 和 *9.34* 纳秒。(CPU:AMD [FX-4300](https://en.wikipedia.org/wiki/List_of_AMD_FX_microprocessors#Piledriver_Core_(Vishera,_32_nm)) 3.8 GHz(四核)。主板:Gigabyte Technology GA-970A-DS3P。操作系统:Linux ([Ubuntu MATE 20.04](https://en.wikipedia.org/wiki/Ubuntu_MATE#Releases) (Focal Fossa) 和 [Cinnamon](https://en.wikipedia.org/wiki/Cinnamon_(desktop_environment) ))。) (2认同)

un3*_*33k 8

//可以被认为是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)