整数部

当应用于整数时,标准除法符号/)在 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 中给出 02/3 的上述例子应该用作 2 / 3.02.0 / 32.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 是太容易了。此外,这些情况可能经常在测试期间避开通知,例如,如果你在包含 floats 但在生产中接收一系列 ints 的阵列上进行测试。此外,如果在 Python 3 中使用相同的代码,那么期望 3 / 2 == 1 为 True 的程序将无法正常工作。

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

有关除法的更多信息,请参阅 Simple Math 主题