Python整数部

示例

当应用于整数时,标准除法符号(/)在Python 3和Python 2中的运行方式有所不同。

在Python 3中将一个整数除以另一个整数时,除法运算x / y表示真正的除法(uses__truediv__方法)并产生浮点结果。同时,Python 2中的同一操作代表了经典的除法运算,该运算将结果向下舍入为负无穷大(也称为发言权)。

例如:

Python 2输出Python 3输出
3 / 211.5
2 / 300.6666666666666666
-3 / 2-2-1.5

舍入为零的行为在Python 2.2中已弃用,但在Python 2.7中出于向后兼容的原因保留了该行为,并在Python 3中将其删除。

注意:要在Python 2中获得浮点结果(无底舍入),我们可以指定带小数点的操作数之一。上面的示例在Python 22/3中给出0了应该用作2 / 3.0or2.0 / 3或2.0/3.0获取0.6666666666666666

Python 2输出Python 3输出
3.0 / 2.01.51.5
2 / 3.00.66666666666666660.6666666666666666
-3.0 / 2-1.5-1.5

还有一个楼层除法运算符(//),在两个版本中的工作方式相同:将其舍入为最接近的整数。(尽管与float一起使用时会返回float)。在这两个版本中,//运算符都映射到__floordiv__。

Python 2输出Python 3输出
3 // 211
2 // 300
-3 // 2-2-2
3.0 // 2.01.01.0
2.0 // 30.00.0
-3 // 2.0-2.0-2.0

可以使用operator模块中的本机函数显式强制执行真正的除法或下限除法:

from operator import truediv, floordiv
assert truediv(10, 8) == 1.25            # 等价于Python 3中的`/`
assert floordiv(10, 8) == 1              # equivalent to `//`

尽管清晰明了,但对每个分区使用运算符功能可能很繁琐。/通常会首选更改运算符的行为。一种常见的做法是通过from __future__ import division在每个模块中添加第一条语句来消除典型的除法行为:

# 需要成为模块中的第一条语句
from __future__ import division

Python 2输出Python 3输出
3 / 21.51.5
2 / 30.66666666666666660.6666666666666666
-3 / 2-1.5-1.5

from __future__ import division保证/运算符代表真实的划分并且仅在包含__future__导入的模块内进行,因此没有令人信服的理由在所有新模块中均未启用它。

注意:其他一些编程语言使用取整为零(截断),而不是像Python那样取整为负无穷大(即那些语言-3 / 2 == -1)。移植或比较代码时,此行为可能会造成混乱。


注意上浮动操作数:作为替代from __future__ import division,可以使用通常的除法符号/,并确保该操作数中的至少一个是一个浮动:3 / 2.0 == 1.5。但是,这可以认为是不良做法。编写起来太容易了,忘记了将其中一个参数强制转换为float。此外,这种情况在测试期间可能经常会漏掉注意,例如,如果您在包含s的数组上进行测试但在生产中收到s的数组。此外,如果在Python 3中使用了相同的代码,则预期为True的程序将无法正常运行。average = sum(items) / len(items)floatint3 / 2 == 1

有关为什么在Python 3中更改除法运算符以及为何应避免使用旧式除法的更多详细原理,请参阅PEP 238。


有关除法的更多信息,请参见“简单数学”主题。