Last modified April 8, 2025
This comprehensive guide explores Python's __divmod__ method, the
special method that implements the built-in divmod() function.
We'll cover basic usage, numeric operations, custom implementations, and
practical examples.
The __divmod__ method is a special method that implements the
divmod() built-in function. It returns a tuple containing the
quotient and remainder when dividing two numbers.
Key characteristics: it takes two arguments (self and other), returns a tuple
of two values (quotient, remainder), and is called by the divmod()
function. It must be implemented for numeric types to support this operation.
Here's a simple implementation showing how __divmod__ works with
built-in numeric types. It demonstrates the basic behavior of the method.
x = 10 y = 3 result = divmod(x, y) print(result) # Output: (3, 1) # Equivalent to: print((x // y, x % y))
This example shows the standard behavior with integers. The divmod()
function returns a tuple with the quotient (3) and remainder (1) of 10 divided by 3.
The __divmod__ method is called behind the scenes when using
divmod() on objects that implement it. For built-in types, this
is already provided.
We can implement __divmod__ in custom classes to support the
divmod() operation. Here's an example with a custom number class.
class MyNumber: def __init__(self, value): self.value = value def __divmod__(self, other): quotient = self.value // other.value remainder = self.value % other.value return (quotient, remainder) a = MyNumber(17) b = MyNumber(5) print(divmod(a, b)) # Output: (3, 2)
This custom number class implements __divmod__ to support the
divmod() operation. It performs integer division and modulo on
the stored values.
The implementation returns a tuple with the quotient and remainder, matching the behavior of built-in numeric types. This makes the class work seamlessly with Python's numeric operations.
The __divmod__ method also works with floating-point numbers,
though the results may be less intuitive due to floating-point precision.
x = 10.5 y = 3.2 result = divmod(x, y) print(result) # Output: (3.0, 0.8999999999999995) # Explanation: # 3.2 * 3 = 9.6 # 10.5 - 9.6 = 0.9 (with floating point precision error)
This example demonstrates divmod() with floating-point numbers.
The quotient is 3.0, and the remainder is approximately 0.9 (with floating-point
precision error).
Note that floating-point arithmetic can introduce small precision errors, as shown in the remainder calculation. This is inherent to floating-point representation in computers.
The behavior of __divmod__ with negative numbers follows Python's
division rules, which might differ from mathematical expectations.
# Positive dividend, negative divisor print(divmod(10, -3)) # Output: (-4, -2) # Negative dividend, positive divisor print(divmod(-10, 3)) # Output: (-4, 2) # Negative dividend and divisor print(divmod(-10, -3)) # Output: (3, -1)
These examples show how divmod() handles negative numbers. The
results maintain the invariant: divmod(a, b)[1] has the same sign
as b.
The quotient is always rounded towards negative infinity, and the remainder has the same sign as the divisor. This is Python's standard behavior for division and modulo operations.
The __divmod__ method can return any type, not just tuples of
numbers. Here's an example returning a custom result object.
class DivModResult:
def __init__(self, quotient, remainder):
self.quotient = quotient
self.remainder = remainder
def __repr__(self):
return f"Result(q={self.quotient}, r={self.remainder})"
class MyNumber:
def __init__(self, value):
self.value = value
def __divmod__(self, other):
q = self.value // other.value
r = self.value % other.value
return DivModResult(q, r)
a = MyNumber(17)
b = MyNumber(5)
result = divmod(a, b)
print(result) # Output: Result(q=3, r=2)
This example shows a custom __divmod__ implementation that returns
a specialized result object instead of a tuple. The DivModResult
class stores the quotient and remainder as attributes.
While this is possible, it's generally recommended to follow Python's convention of returning a tuple for consistency with built-in types and user expectations.
__floordiv__ and __mod__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.