Complete guide to Python's divmod function covering basic usage, numeric types, and practical examples of division and modulo operations.
Last modified April 11, 2025
This comprehensive guide explores Python’s divmod function, which performs division and modulo operations simultaneously. We’ll cover numeric types, practical applications, and performance considerations.
The divmod function takes two numbers and returns a tuple containing their quotient and remainder. It combines floor division (//) and modulo (%) operations in one call.
Key characteristics: works with integers, floats, and complex numbers. For integers, it returns (a // b, a % b). For floats, it returns (q, a % b) where q is usually math.floor(a / b).
Here’s simple usage with integers showing how divmod returns both the quotient and remainder from division.
basic_divmod.py
print(divmod(10, 3)) # (3, 1) print(10 // 3, 10 % 3) # Same as above
print(divmod(-10, 3)) # (-4, 2) print(divmod(10, -3)) # (-4, -2)
This example shows divmod with integers. The first value in the tuple is the quotient, the second is the remainder. Note how negative numbers affect the results.
The results follow Python’s floor division rules where the quotient is rounded towards negative infinity. The remainder has the same sign as the divisor.
divmod is commonly used for time conversions. This example converts seconds into hours, minutes, and seconds.
time_conversion.py
def convert_seconds(total_seconds): hours, remaining = divmod(total_seconds, 3600) minutes, seconds = divmod(remaining, 60) return hours, minutes, seconds
print(convert_seconds(3661)) # (1, 1, 1) print(convert_seconds(45296)) # (12, 34, 56)
The function first divides total seconds by 3600 to get hours. The remainder is then divided by 60 to get minutes, with the final remainder being seconds.
This demonstrates how divmod can elegantly handle multi-step conversions where you need both quotient and remainder at each step.
divmod also works with floating-point numbers. This example shows its behavior with float inputs.
float_divmod.py
print(divmod(10.5, 3)) # (3.0, 1.5) print(divmod(10.5, 0.5)) # (21.0, 0.0)
print(divmod(-10.5, 3)) # (-4.0, 1.5) print(divmod(10.5, -3)) # (-4.0, -1.5)
With floats, divmod returns the quotient as a float and the remainder that would make the original equation true: a = b * q + r.
Note how the remainder maintains the same sign as the divisor, similar to the integer behavior. Floating-point precision can affect exact results.
You can make custom objects work with divmod by implementing the divmod special method. This example creates a Fraction class.
custom_divmod.py
class Fraction: def init(self, numerator, denominator): self.n = numerator self.d = denominator
def __divmod__(self, other):
quotient = self.n * other.d // (self.d * other.n)
remainder = Fraction(self.n * other.d % (self.d * other.n), self.d * other.n)
return (quotient, remainder)
def __repr__(self):
return f"Fraction({self.n}/{self.d})"
f1 = Fraction(10, 3) f2 = Fraction(1, 2) print(divmod(f1, f2)) # (6, Fraction(2/6))
The Fraction class implements divmod to return a quotient (integer) and remainder (Fraction). When we call divmod on Fraction instances, Python uses this method.
This pattern is useful for mathematical classes where division with remainder makes sense (polynomials, vectors, etc.).
The divmod function raises errors with unsupported types or division by zero. This example shows proper error handling.
errors.py
try: print(divmod(“10”, 3)) except TypeError as e: print(f"Error: {e}") # unsupported operand type(s) for divmod(): ‘str’ and ‘int’
try: print(divmod(10, 0)) except ZeroDivisionError as e: print(f"Error: {e}") # integer division or modulo by zero
These examples demonstrate divmod’s behavior with invalid inputs. Strings and division by zero raise appropriate exceptions.
To make a class work with divmod, implement divmod as shown in the previous example.
Use for paired operations: When you need both quotient and remainder
Prefer for time conversions: Ideal for breaking down units (hours, minutes)
Understand float behavior: Remainder sign matches divisor
Implement divmod: For custom numeric types
Handle division by zero: Always catch ZeroDivisionError
My name is Jan Bodnar, and I am a passionate programmer with extensive programming experience. I have been writing programming articles since 2007. To date, I have authored over 1,400 articles and 8 e-books. I possess more than ten years of experience in teaching programming.
List all Python tutorials.