考虑 Python 中的这种划分:
Python 3.1 (r31:73574, Jun 26 2009, 20:21:35) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 2/2
1.0
这是故意的吗?我强烈记得返回 int/int = int
的早期版本。我应该怎么办?是否有新的除法运算符或者我必须始终转换?
糟糕,立即找到 2//2
。这将输出一个 int 而不是 float。
//
而不是 /
并导致依赖于浮点数的代码中断,而没有意识到其中的含义。
Python 2.7 和 Python 3 中除法运算符的行为
在 Python 2.7 中:默认情况下,除法运算符将返回整数输出。
要获得双倍结果,请将被除数或除数乘以 1.0。
100/35 => 2 # Expected is 2.857142857142857
(100*1.0)/35 => 2.857142857142857
100/(35*1.0) => 2.857142857142857
在 Python 3 中
// => used for integer output
/ => used for double output
100/35 => 2.857142857142857
100//35 => 2
100.//35 => 2.0 # Floating-point result if the divisor or dividend is real
//
不是“用于整数输出”。 //
是 floor()
函数对除法结果的结果,如果两个操作数是整数,则反过来产生一个整数,如果其中至少一个是浮点数,则产生一个浮点数,以实现类型一致性。
接受的答案已经提到 PEP 238。我只想为那些对正在发生的事情感兴趣而无需阅读整个 PEP 的人快速了解一下幕后情况。
Python 将 +
、-
、*
和 /
等运算符映射到特殊函数,例如 a + b
等价于
a.__add__(b)
关于 Python 2 中的除法,默认情况下只有 /
映射到 __div__
,结果取决于输入类型(例如 int
、float
)。
Python 2.2 引入了 __future__
特性 division
,它通过以下方式改变了除法语义(TL;PEP 238 的 DR):
/ 映射到 __truediv__ ,它必须“返回除法数学结果的合理近似值”(引自 PEP 238)
// 映射到 __floordiv__,它应该返回 / 的下限结果
在 Python 3.0 中,PEP 238 的更改成为默认行为,并且 Python 的对象模型中不再有特殊的方法 __div__
。
如果您想在 Python 2 和 Python 3 中使用相同的代码,请使用
from __future__ import division
并坚持 /
和 //
的 PEP 238 语义。
根据 Python 3 文档,当 Python 除以整数时,尽管预期为整数,但仍会生成浮点数。
要专门打印整数,请使用 floor division method
。地板除法是四舍五入零并删除小数点。 Represented by //
因此,使用 2//2
而不是 2/2
无论使用 Python 2 还是 Python 3,您还可以从 __future__
导入除法。
不定期副业成功案例分享
/
的歧义足以成为需要在 Python 3 中修复的语言设计“错误”。这可能是一个有争议的决定,但有足够多的人感觉到它是正确的。把我算在喜欢改变的群体中。很高兴我们都同意不同意。干杯。 :)