本系列文章翻译自Python父亲ssdmht van Rossum的系列博客“The History of Python”。 这个博客系列可以帮助我们了解Python及其进化。 经ssdmht同意,这里推荐翻译。 请大家喜欢,多多关照。
系列地址: http://blog.kantli.com/theme/1
1今天又有人问,为什么Python中整数的除法向下舍入,而不像c语言那样用0舍入?
在正整数中,两种整形方法的结果相同,为:
如果5//22之一为负,则结果将无限接近负,而不是接近零:
关于-5/2-3 5//-2-3这个问题,有些人很为难,其实是在数学上考虑的。 整除操作(/) )和模具操作(% )组合在一起,实现一种数学关系。 所有变量都是整数。
# a/b=q馀r即
' # b*q r=a,其中0=r b表示a为负数(b仍为正数),一个是让 q 向零取整,于是余数 r 会变成负数,即 0 = abs(r) b;另一个是让 q 向负无穷取整,则余数的设定保持不变。
数学家们总是喜欢后者的选择。 (请参阅维基https://zh.wikipedia.org/wiki/修改器)
另一方面,在Python上,我也选择了后者的方案。 因为在实际应用中,有些a可以是正的,也可以是负的。
以POSIX时间戳(1970年以后的秒数)为例,要获得当前的具体时间,每天24 * 3600=86400秒,因此只需保留t % 86400即可。 如果时间戳为负数,即早于1970年,则只能通过向下取整数而不是零来获得正确的结果。
另一个可能的例子是图像点的计算。 我确信还有很多其他的例子。
顺便说一下,如果b取负数,则整个等式相反。 0=r b。
2那么,c语言为什么采用整为零呢? 当时的硬件设计为—— 在最早期的硬件中,负数的表现方式是“符号 + 数字”,而不是现在一般采用的补码(至少整数是如此)。
我用的第一台电脑是CDC主机,整数和浮点数都用补数表示,60个1用负0表示。
hxdtk Peters担心我会把这个原则扩展到浮点数。 他可能是正确的,但是如果x是一个非常小的负数,那么取整原则以下将失去x % 1.0的精度。 但是,这个问题不影响我让整数采取下取原则。
PS .请注意我使用的符号是/而不是/。 这是Python 3的语法,也可以在Python 2中使用。 这表示用户明确使用整除而不是除法。 Python 2的/操作可能存在歧义。 这是因为如果两个参数都是整数,则只返回整数;如果有浮点数参数,则返回浮点数。 但是,这是另一回事。 请参考PEP 238。
公众号:ReadingPython