Die Python-Funktion divmod(a, b) führt eine Ganzzahldivision und eine Modulo-Operation in einem einzigen Aufruf aus und liefert beide Ergebnisse als Tupel (quotient, rest). Sie ist effizienter als getrennte Aufrufe von a // b und a % b, weil intern nur eine Division durchgeführt wird.
Einleitung
Bei vielen Aufgaben braucht man Quotient und Rest gleichzeitig — etwa bei Zeitumrechnungen (Sekunden in Minuten und Sekunden), Paginierung (Item-Index in Page und Position) oder beim Aufteilen von Beträgen. divmod() macht das in einem Schritt und ist damit nicht nur kürzer, sondern auch performanter als zwei separate Operationen.
Die Funktion arbeitet mit ganzen Zahlen (int), Fließkommazahlen (float) und benutzerdefinierten Objekten, die __divmod__() implementieren.
Syntax
divmod(a, b)a Dividend — die Zahl, die geteilt wird (int, float oder Objekt mit __divmod__).
b Divisor — die Zahl, durch die geteilt wird. Darf nicht 0 sein (ZeroDivisionError).
Rückgabewert
Ein Tupel (quotient, rest):
- Bei
int:(a // b, a % b)— beide Ergebnisse sindint. - Bei
float:(math.floor(a / b), a % b)— beide Ergebnisse sindfloat. - Bei Custom-Objekten: das Ergebnis von
a.__divmod__(b).
Beispiele
Ganze Zahlen
print(divmod(17, 5))
print(divmod(20, 4))(3, 2)
(5, 0)Sekunden in Minuten und Sekunden
seconds = 3725
minutes, rest_sek = divmod(seconds, 60)
hours, minutes = divmod(minutes, 60)
print(f"{hours}h {minutes}m {rest_sek}s")1h 2m 5sPaginierung
item_index = 47
items_pro_seite = 10
seite, position = divmod(item_index, items_pro_seite)
print(f"Seite {seite + 1}, Position {position + 1}")Seite 5, Position 8Mit negativen Zahlen
# Python rundet bei // immer Richtung negativ unendlich
print(divmod(-17, 5))
print(divmod(17, -5))(-4, 3)
(-4, -3)Mit Fließkommazahlen
print(divmod(10.5, 3))(3.0, 1.5)Praktische Beispiele
Geldbetrag in Euro und Cent aufteilen
cent_total = 12_345
euro, cent = divmod(cent_total, 100)
print(f"{euro},{cent:02d} €")123,45 €Mehrteiliger Dezimalbruch
# Tage, Stunden, Minuten, Sekunden aus Sekunden
total = 100_000 # Sekunden
days, rest = divmod(total, 86400)
hours, rest = divmod(rest, 3600)
minutes, seconds = divmod(rest, 60)
print(f"{days}T {hours}h {minutes}m {seconds}s")1T 3h 46m 40sCustom-Klasse mit __divmod__
class Money:
def __init__(self, cent):
self.cent = cent
def __divmod__(self, anderer):
# Aufteilen in Anteile + Rest in Cent
shares, rest = divmod(self.cent, anderer)
return shares, Money(rest)
def __repr__(self):
return f"Money({self.cent} ct)"
invoice = Money(1010)
shares, rest = divmod(invoice, 3)
print(f"Pro Person: {shares} ct, Rest: {rest}")Pro Person: 336 ct, Rest: Money(2 ct)Praktische Hinweise
- Performance:
divmod(a, b)ist schneller als(a // b, a % b), weil intern nur eine Division ausgeführt wird. - ZeroDivisionError: Bei
b == 0wird einZeroDivisionErrorausgelöst. - Idiomatisch für Zeit-Umrechnungen und alle Aufgaben, bei denen Quotient und Rest gemeinsam gebraucht werden.
- Verwandte Operatoren:
//(Ganzzahldivision),%(Modulo),math.fmod()(Float-Modulo nach C-Konvention).