数字类型实战——除法:经典的、取整的、真正的

未匹配的标注

在以前的章节中已经看到了除法是如何工作的,所以应该知道它在Python 3系列和2系列中的表现是有少许不同的。事实上,有三种除法,和两种不同的除法操作符,其中一种操作符在3系列中改变了含义。这故事有点过于细节化了,但它是3系列中另一个重大改变而且会破坏2系列的代码,因此必须弄清楚这些除法操作符的事实:

X / Y

经典的真正的除法。在Python 2系列中,这个操作符执行经典的除法,对整数截断结果,对浮点数保留余数(也就是小数部分)。在Python 3系列中,它执行真正的除法,总是不管运算对象的类型,以浮点结果保留余数。

X // Y

向下取整除法。这个除法添加于Python 2.2,然后在Python 2系列和3系列中都可用,它总是不管运算对象的类型,将小数的余数向下截断为它们的整数。它结果的类型取决于运算对象的类型。

真正的除法被增加用来解决“在像Python这种动态类型语言中,原来的经典除法模型依赖于运算对象类型,结果难以预料”的事实”。因为这个限制,经典除法在3系列中被移除—— ///操作符在3系列中实现了真正的和向下取整的除法。Python 2系列默认为经典和向下取整的除法,但可以让真正的除法成为一个可选项。总结:

  • 在3系列中,/现在总是执行真正的除法,不管运算对象类型,总是返回一个包含任何余数的浮点结果。//执行向下取整除法,它截断余数,且对整数运算对象返回整数,或如果有任何运算对象为浮点数时返回浮点数。
  • 在2系列中,/进行经典的除法,如果两个运算对象都是整数,则执行截断整数除法,否则则执行浮点除法(保留余数)。//进行向下取整除法且计算结果和3系列中一样,对整数执行截断除法,对浮点数执行向下取整除法。

下面是在3系列和2系列中这两个操作符的使用情况——每个操作集中的第一个操作是可能影响代码的至关重要的行间差异:

C:\code> C:\Python33\python
>>>
>>> 10 / 4 # 在 3.X 中不同: 保留余数
2.5
>>> 10 / 4.0 # 在 3.X 中相同: 保留余数
2.5
>>> 10 // 4 # 在 3.X 中相同: 截断余数
2
>>> 10 // 4.0 # 在 3.X 中相同: 截断到向下取整数
2.0
C:\code> C:\Python27\python
>>>
>>> 10 / 4 # 这可能在移植到3系列上会出错!
2
>>> 10 / 4.0
2.5
>>> 10 // 4 # 如果需要截断,在2系列中使用这个
2
>>> 10 // 4.0
2.0

注意在3系列中, //的结果的数据类型仍然依赖于运算对象的类型:如果有一个是浮点数,则结果是浮点数;否则,就是整数。虽然这可能看起来类似于在2系列中/的类型依赖行为(它鼓励了3系列中的改变),但返回值的类型远不如返回值本身的差异那么至关重要。

而且,因为 // 在一定程度上是作为依赖于截断整数除法的程序(而且这比期望的要更普遍)的兼容性工具,它必须为整数返回整数。当需要整数截断时,在2系列中使用//代替/帮助代码与3系列的代码兼容。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~