Python模运算%详解

-- TOC --

python使用%符号来表示模运算。

用一个自定义的函数来表示%的计算过程,如下,本文下面所有在python shell中的计算,都可以用这个自定义的函数来验证:

>>> def mod(x,y):
...     return x-y*(x//y)  # // means round floor, y != 0. 

模运算跟求余数不太一样,模运算包含了求余数,同时在数学上,模运算的概念是大于求余数的。

>>> 7 % 3
1
>>> 8 % 3
2
>>> 9 % 3
0
>>> 9 % 30
9

这几个运算,是模运算,也是在求余数。

求余数这个概念,是需要在除数与被除数都为正数的前提下,才能成立的,如果有负数,求余这个概念会失去实际意义,我们这个时候就要说成是模运算了。

>>> 7 % 4
3
>>> 7 % -4
-1
>>> -7 % -4
-3
>>> -7 % 4
1

以上这几个模运算的式子,只有第1个与求余相同,也很好理解,其它结构可能都有些费解。模运算的结果,一定在0到模数之间,比如模式-4,结果就一定是0,-1,-2,-3。

>>> 5 % -4
-3
>>> 6 % -4
-2
>>> 7 % -4
-1
>>> 8 % -4
0
>>> 9 % -4
-3

再看一组例子:

>>> 9 % 3
0
>>> -9 % 3
0
>>> -9 % -3
0
>>> 9 % -3
0

都能除尽,结果都是0,不管有无负号。

Python的模运算,不仅可以有负数,还可以有小数:

>>> 8 % 3.9
0.20000000000000018
>>> 8 % -3.9
-3.6999999999999997

为什么可以用小数来做模运算?(个人理解)

>>> 8%3.9
0.20000000000000018
>>> (80%39)/10
0.2
>>>
>>> 8%-3.9
-3.6999999999999997
>>> (80%-39)/10
-3.7

以上代码对应一个用小数来取模的解释:就是对取模后的结果做除法的捷径。

不能 mod 0,会出现ZeroDivisionError异常。

本文链接:https://cs.pynote.net/sf/python/202206051/

-- EOF --

-- MORE --