divmod()函数也是Python的内置函数之一,其作用是对传入的两个数值(不能是复数)做除法运算和求余运算。
Python中divmod()函数的语法格式如下:
divmod(a, b)
该函数有a, b两个参数,都是数值类型的,包括其它进制的数值,但不能是复数。其中,a是被除数(分子),b是除数(分母)。
该函数的返回值是一个元组,包含a与b两个数的商及其余数。
对于整型参数,其结果相当于(a // b, a % b);
对于浮点数,其结果是( q, a % b),q通常是math.floor(a / b),但也可能比其小1。在任何情况下,q * a + a % b都非常接近a。如果 a % b是非零值,结果与b的符号相同,同时,0 <= abs(a % b) < abs(b)。
上面叙述中,"//"运算符是求两个数商的整数部分;math.floor()是下舍取整函数,如math.floor(-35.3) = -36.0,math.floor(23.8) = 23.0;
abs()是求某数绝对值的函数,详见本站:Python中的abs()函数一文中的相关介绍。
Python divmod()函数用于两个整数间,返回两个数的商与余数构成的元组。
#对于整数,输出包含其商和余数的元组
dm = divmod(13, 5)
print(dm)
#可以使用两个变量来分别接收其商和余数
x, y = divmod(13, 5)
print(x)
print(y)
其输出结果如下所示:
(2, 3)
2
3
在Python 3.8.2中运行的结果如下图所示:
当向函数中传递的参数为浮点数时,divmod函数用于两个符号相同的浮点数时,其使用与整数类似的方式计算其商和余数。但用于异号的两个浮点数时,其商部分的值是两个数的商下舍后,再求其余数部分,比如参数取5和-2.3时,其真正的商约是-2.1739,那么使用divmod()函数时,其结果中的商值下舍后为-3,则其余数部分为:5-(-2.3)*(-3) = -1.9,即余数部分的绝对值约为1.9,其符号与除数相同,最终为-1.9。实际上,在Python中divmod(5, -2.3)的输出结果为:(-3.0, -1.8999999999999995)。
#用于浮点数中
dm1 = divmod(10, 2.5)
print("dm1=", dm1)
dm2 = divmod(13, 3.2)
print("dm2=", dm2)
dm3 = divmod(12.4, 3.2)
print("dm3=", dm3)
dm4 = divmod(12.4, -3.2)
print("dm4=", dm4)
dm5 = divmod(-12.4, 3.2)
print("dm5=", dm5)
dm6 = divmod(-12.4, -3.2)
print("dm6=", dm6)
输出结果如下:
dm1= (4.0, 0.0)
dm2= (4.0, 0.1999999999999993)
dm3= (3.0, 2.8)
dm4= (-4.0, -0.40000000000000036)
dm5= (-4.0, 0.40000000000000036)
dm6= (3.0, -2.8)
在Python3.8.2中的输出情形如下图所示:
上面例子中,因为小数表示的精度问题,输出结果有令人惊愕的效果。
Python divmod函数也可以用于其它进制中的参数中,同时可以不同进制之间混用。
其输出结果都是十进制形式。
#用于其它进制
dm7 = divmod(10, 0b110)
print("dm7=", dm7)
dm8 = divmod(0xAF, 0b110)
print("dm8=", dm8)
dm9 = divmod(0xAF, 0O17)
print("dm9=", dm9)
输出结果如下:
dm7= (1, 4)
dm8= (29, 1)
dm9= (11, 10)
在上面说过,Python中的divmod()函数不能使用于复数;从常识的角度来讲,第二个参数不能为0.下面使用例子来说明这些情况下的输出情况。
#一些异常情况
print(divmod(3 + 4j, 2))
print(divmod(9 + 5j, 4 + 2j))
print(divmod(11, 0))
print(divmod((5,4),(3,3)))
以上三个例子分别执行时,前两个报错的异常信息相同,即TypeError: can't take floor or mod of complex number.
第3个执行时的异常信息为:ZeroDivisionError: integer division or modulo by zero.
第4个执行时的异常信息为:TypeError: unsupported operand type(s) for divmod(): 'tuple' and 'tuple'.
以上是关于Python divmod函数在各种情况下的执行情况。
新闻热点
疑难解答