考虑Python 3中的这种划分:
>>> 2/2
1.0
这是有意的吗?我清楚地记得早期版本返回int/int = int。我该怎么办?是否有新的除法运算符或者我必须一直施法?
在2。X,行为确实是相反的;请参阅如何将除法强制为浮点数?除法一直四舍五入到0?反之为2。x-specific问题。
考虑Python 3中的这种划分:
>>> 2/2
1.0
这是有意的吗?我清楚地记得早期版本返回int/int = int。我该怎么办?是否有新的除法运算符或者我必须一直施法?
在2。X,行为确实是相反的;请参阅如何将除法强制为浮点数?除法一直四舍五入到0?反之为2。x-specific问题。
当前回答
公认的答案已经提到了PEP 238。我只是想为那些对正在发生的事情感兴趣而没有阅读整个PEP的人添加一个快速的幕后介绍。
Python将+、-、*和/等操作符映射到特殊函数,例如a + b等价于
a.__add__(b)
关于Python 2中的除法,默认情况下只有/映射到__div__,结果取决于输入类型(例如int, float)。
Python 2.2引入了__future__特性除法,它以以下方式改变了除法语义(TL; PEP 238的DR):
/映射到__truediv__,它必须“返回 除法的数学结果”(引自PEP 238) //映射到__floordiv__,它应该返回/的floor结果
在Python 3.0中,PEP 238的更改成为默认行为,并且在Python的对象模型中没有更特殊的方法__div__。
如果你想在Python 2和Python 3中使用相同的代码,请使用
from __future__ import division
并坚持PEP 238的/和//语义。
其他回答
公认的答案已经提到了PEP 238。我只是想为那些对正在发生的事情感兴趣而没有阅读整个PEP的人添加一个快速的幕后介绍。
Python将+、-、*和/等操作符映射到特殊函数,例如a + b等价于
a.__add__(b)
关于Python 2中的除法,默认情况下只有/映射到__div__,结果取决于输入类型(例如int, float)。
Python 2.2引入了__future__特性除法,它以以下方式改变了除法语义(TL; PEP 238的DR):
/映射到__truediv__,它必须“返回 除法的数学结果”(引自PEP 238) //映射到__floordiv__,它应该返回/的floor结果
在Python 3.0中,PEP 238的更改成为默认行为,并且在Python的对象模型中没有更特殊的方法__div__。
如果你想在Python 2和Python 3中使用相同的代码,请使用
from __future__ import division
并坚持PEP 238的/和//语义。
请看PEP-238:更改除法运算符
//操作员可以明确要求楼层划分。
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
哎呀,马上找到2//2。这将输出一个int型而不是浮点型。