当应用于整数时,标准除法符号(/)在Python 3和Python 2中的运行方式有所不同。
在Python 3中将一个整数除以另一个整数时,除法运算x / y表示真正的除法(uses__truediv__方法)并产生浮点结果。同时,Python 2中的同一操作代表了经典的除法运算,该运算将结果向下舍入为负无穷大(也称为发言权)。
例如:
码 | Python 2输出 | Python 3输出 |
---|---|---|
3 / 2 | 1 | 1.5 |
2 / 3 | 0 | 0.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.0 | 1.5 | 1.5 |
2 / 3.0 | 0.6666666666666666 | 0.6666666666666666 |
-3.0 / 2 | -1.5 | -1.5 |
还有一个楼层除法运算符(//),在两个版本中的工作方式相同:将其舍入为最接近的整数。(尽管与float一起使用时会返回float)。在这两个版本中,//运算符都映射到__floordiv__。
码 | Python 2输出 | Python 3输出 |
---|---|---|
3 // 2 | 1 | 1 |
2 // 3 | 0 | 0 |
-3 // 2 | -2 | -2 |
3.0 // 2.0 | 1.0 | 1.0 |
2.0 // 3 | 0.0 | 0.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 / 2 | 1.5 | 1.5 |
2 / 3 | 0.6666666666666666 | 0.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。
有关除法的更多信息,请参见“简单数学”主题。