整数部
当应用于整数时,标准除法符号 (/
)在 Python 3 和 Python 2 中的运行方式不同。
当在 Python 3 中将整数除以另一个整数时,除法运算 x / y
表示真正的除法 (使用 __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 中获得 float 结果(不进行舍入舍入),我们可以指定一个带小数点的操作数。在 Python 2 中给出 0
的 2/3
的上述例子应该用作 2 / 3.0
或 2.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 返回)在两个版本中,//
运算符映射到 __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 # equivalent to `/` in Python 3
assert floordiv(10, 8) == 1 # equivalent to `//`
虽然清晰明确,但为每个部门使用运算符功能可能会很乏味。通常更喜欢改变/
运算符的行为。通常的做法是通过添加 from __future__ import division
作为每个模块中的第一个语句来消除典型的除法行为:
# needs to be the first statement in a module
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 那样舍入到负无穷大 (即在那些语言中)。移植或比较代码时,此行为可能会造成混淆。
关于浮点操作数的注意事项 :作为 from __future__ import division
的替代,可以使用通常的除法符号/
并确保至少有一个操作数是浮点数:3 / 2.0 == 1.5
。但是,这可以被认为是不好的做法。编写 average =
sum(items) / len(items)
并忘记将其中一个参数转换为 float 是太容易了。此外,这些情况可能经常在测试期间避开通知,例如,如果你在包含 float
s 但在生产中接收一系列 int
s 的阵列上进行测试。此外,如果在 Python 3 中使用相同的代码,那么期望 3 / 2 == 1
为 True 的程序将无法正常工作。
有关为什么在 Python 3 中更改除法运算符以及为什么应该避免旧式除法的更详细原理,请参阅 PEP 238 。
有关除法的更多信息,请参阅 Simple Math 主题 。