Last chance! 50% off DataCamp Premium
Sale ends in
De modulo-operator (%) in Python is een fundamentele rekenkundige operator die de rest bepaalt van een deling. Hoewel het concept eenvoudig is, speelt het een cruciale rol in uiteenlopende programmeer-toepassingen. Van controleren of een getal even of oneven is tot door reeksen fietsen en schrikkeljaren bepalen: het beheersen van de modulo-operator kan je probleemoplossend vermogen in Python vergroten.
De modulo-operator begrijpen is essentieel omdat die vaak voorkomt bij:
In deze blog geef ik een uitgebreide gids voor het gebruik van de modulo-operator in Python, met de syntax, het gedrag met verschillende soorten getallen, use-cases en praktische voorbeelden. Ben je nieuw in Python? Volg dan onze cursus Introduction to Python.
De modulo-operator (%) berekent de rest van de deling tussen twee getallen. Gegeven twee getallen a (deeltal) en b (deler), geeft de modulo-bewerking de rest terug wanneer a door b wordt gedeeld.
Modulo vindt zijn oorsprong in modulaire rekenkunde, een rekenstelsel voor gehele getallen waarbij getallen "omslag" maken nadat ze een bepaalde waarde (modulus) hebben bereikt. Het wordt veel gebruikt in cryptografie, hashing en cyclische berekeningen.
Denk aan een 12-uursklok: na 12 gaan we niet door naar 13, maar terug naar 1. Dit is in essentie modulaire rekenkunde met modulus 12:
13 % 12 = 1, wat betekent dat 13 uur overeenkomt met 1 uur in een 12-uursindeling.In Python heeft de modulo-operator een eenvoudige syntax:
remainder = dividend % divisor
Laten we een paar basisvoorbeelden bekijken:
# Basic modulo operations
print(7 % 3)
print(15 % 4)
print(20 % 5)
1
3
0
Als we 7 delen door 3, krijgen we 2 met rest 1. De modulo-operator geeft ons die rest. Op dezelfde manier geeft 15 gedeeld door 4 3 met rest 3, en 20 gedeeld door 5 geeft precies 4 zonder rest.
Nu we de basis van de modulo-operator begrijpen, bekijken we hoe die zich gedraagt bij gehele getallen.
Werken met positieve gehele getallen is de meest rechttoe-rechtaan toepassing van de modulo-operator:
# Examples with positive integers
print(10 % 3)
print(25 % 7)
print(100 % 10)
1
4
0
In deze voorbeelden berekenen we de uitkomsten door te bepalen hoe vaak de deler in het deeltal past en vervolgens te kijken wat er overblijft:
Het gedrag van de modulo-operator wordt interessanter bij negatieve getallen. Python volgt een specifieke regel: de uitkomst van a % b heeft altijd hetzelfde teken als b (de deler).
# Examples with negative integers
print(-10 % 3)
print(10 % -3)
print(-10 % -3)
2
-2
-1
Deze resultaten lijken in eerste instantie misschien niet intuïtief, maar ze volgen een consistente regel:
-10 % 3: In plaats van -1 (wat je misschien verwacht als je denkt aan -10 ÷ 3 = -3 rest -1), geeft Python 2 terug. Dit komt doordat Python zoekt naar een waarde tussen 0 en 3 (exclusief) die, opgeteld bij een veelvoud van 3, -10 oplevert. Het antwoord is 2, want -12 + 2 = -10.10 % -3: De uitkomst heeft hetzelfde teken als de deler (-3), dus we krijgen -2. Dit komt doordat 10 = (-3) × (-4) + (-2).-10 % -3: De uitkomst is -1, want -10 = (-3) × 3 + (-1).Begrijpen hoe Python negatieve getallen behandelt bij modulo-bewerkingen is cruciaal bij cyclische berekeningen, zoals:
De modulo-operator in Python is niet beperkt tot gehele getallen; hij werkt ook met drijvende-kommagetallen:
# Modulo with floating-point numbers
print(7.5 % 2)
print(9.7 % 4.2)
print(5.0 % 0.2)
1.5
1.299999999999999
0.19999999999999973
Bij kommagetallen volgt de modulo-bewerking hetzelfde principe: hij geeft de rest na deling. Door de manier waarop kommagetallen in computers worden opgeslagen (IEEE 754-formaat) kunnen er echter kleine afrondingsfouten optreden.
Zo geeft Python in plaats van 1.3 1.299999999999999 terug, en in plaats van 0.2 0.19999999999999973. Deze kleine onnauwkeurigheden zijn gebruikelijk in kommagetalaritmetiek en moet je meenemen bij nauwkeurige berekeningen.
Python biedt ook de functie math.fmod() uit de math-module als alternatief voor modulo-bewerkingen met kommagetallen; die kan bepaalde randgevallen anders afhandelen:
import math
print(math.fmod(7.5, 2))
print(math.fmod(-7.5, 2))
# Compare with Python's modulo operator
print(-7.5 % 2)
1.5
-1.5
0.5
Het belangrijkste verschil tussen % en math.fmod() zit in de behandeling van negatieve getallen. Waar % garandeert dat het resultaat hetzelfde teken heeft als de deler en een waarde teruggeeft in het bereik [0, deler), zorgt math.fmod() ervoor dat het resultaat hetzelfde teken heeft als het deeltal. Dit onderscheid is belangrijk in toepassingen waarbij het teken van de rest ertoe doet.
Wanneer gebruik je nu % en wanneer math.fmod()?
% wanneer je consistent teken-gedrag nodig hebt (bijv. door een bereik fietsen).math.fmod() wanneer het teken van het deeltal behouden moet blijven, zoals in fysicasimulaties of wiskundige functies.Zoals we eerder zagen, komt Pythons implementatie van de modulo-operator met negatieve getallen niet altijd overeen met je eerste intuïtie. Laten we dit gedrag systematischer verkennen:
# Understanding the pattern with negative numbers
for i in range(-10, 11):
result = i % 3
print(f"{i} % 3 = {result}")
-10 % 3 = 2
-9 % 3 = 0
-8 % 3 = 1
-7 % 3 = 2
-6 % 3 = 0
-5 % 3 = 1
-4 % 3 = 2
-3 % 3 = 0
-2 % 3 = 1
-1 % 3 = 2
0 % 3 = 0
1 % 3 = 1
2 % 3 = 2
3 % 3 = 0
4 % 3 = 1
5 % 3 = 2
6 % 3 = 0
7 % 3 = 1
8 % 3 = 2
9 % 3 = 0
10 % 3 = 1
Let op het patroon: de resultaten doorlopen herhaaldelijk 0 → 1 → 2, ongeacht of het deeltal positief of negatief is. Dit consistente gedrag maakt de modulo-operator bijzonder handig bij cyclische berekeningen, zoals:
De wiskundige formule die Python volgt voor modulo is:
Import math
a % b = a - (b * math.floor(a / b))
Dit zorgt ervoor dat het resultaat altijd tussen 0 en b (exclusief) ligt wanneer b positief is, of tussen b en 0 (exclusief) wanneer b negatief is.
De modulo-operator (%) in Python berekent de rest van een deling. Hij volgt een consistente wiskundige formule:
a % b = a - (b * math.floor(a / b))
Belangrijke regels van Pythons modulo-gedrag:
b > 0)[0, b) (inclusief 0, exclusief b).b < 0)(b, 0] (exclusief b, inclusief 0).b (de deler).% dezelfde formule maar kunnen kleine afrondingsfouten optreden door de precisie van floats.% en math.fmod()% zorgt dat de rest hetzelfde teken heeft als de deler.math.fmod(a, b) zorgt dat de rest hetzelfde teken heeft als het deeltal.Laten we enkele praktische toepassingen van de modulo-operator bekijken en nog wat voorbeelden zien.
Een van de meest voorkomende toepassingen van de modulo-operator is bepalen of een getal even of oneven is:
def is_even(number):
return number % 2 == 0
def is_odd(number):
return number % 2 != 0
# Testing the functions
numbers = [1, 2, -3, 4, -5, 6, 7]
for num in numbers:
if is_even(num):
print(f"{num} is even")
else:
print(f"{num} is odd")
1 is odd
2 is even
-3 is odd
4 is even
-5 is odd
6 is even
7 is odd
Dit werkt omdat even getallen een rest van 0 geven bij deling door 2, terwijl oneven getallen een rest van 1 of -1 geven.
De modulo-operator is perfect voor het creëren van cyclisch gedrag, zoals roteren door een lijst met items:
days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
def get_day(n):
# Get the day of the week for the nth day, where day 0 is Monday
return days[n % len(days)]
# Starting from Monday (day 0), what day is it after 10 days?
print(get_day(10)) # Output: "Thursday"
# What day was it 15 days ago from Monday?
print(get_day(-15)) # Output: "Sunday"
Thursday
Sunday
In dit voorbeeld geeft de functie altijd een geldige weekdag terug, ongeacht hoe groot of klein (negatief) n wordt.
Hoewel schrikkeljaarberekeningen meerdere voorwaarden bevatten, staat de modulo-operator centraal in het algoritme:
Schikkeljaren volgen een specifieke regel:
def is_leap_year(year):
return (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)
# Test the function
years = [1900, 2000, 2004, 2020, 2023, 2024]
for year in years:
if is_leap_year(year):
print(f"{year} is a leap year")
else:
print(f"{year} is not a leap year")
1900 is not a leap year
2000 is a leap year
2004 is a leap year
2020 is a leap year
2023 is not a leap year
2024 is a leap year
Dit zorgt ervoor dat de regels voor schrikkeljaren in de Gregoriaanse kalender correct worden toegepast.
Hier zijn enkele manieren waarop je de modulo-operator kunt gebruiken in je eigen Python-projecten:
De modulo-operator wordt vaak gebruikt in lussen om acties op regelmatige intervallen uit te voeren:
# Print a message every 5 iterations
for i in range(1, 11):
print(f"Processing item {i}", end=": ")
if i % 5 == 0:
print("Checkpoint reached!")
else:
print("Continuing...")
Processing item 1: Continuing...
Processing item 2: Continuing...
Processing item 3: Continuing...
Processing item 4: Continuing...
Processing item 5: Checkpoint reached!
Processing item 6: Continuing...
Processing item 7: Continuing...
Processing item 8: Continuing...
Processing item 9: Continuing...
Processing item 10: Checkpoint reached!
Dit patroon is handig voor batchverwerking, voortgangsrapportage of elke functionaliteit die periodiek moet plaatsvinden.
In cryptografische toepassingen is modulo-rekenkunde fundamenteel. Hier is een vereenvoudigd voorbeeld van hoe modulo kan worden gebruikt in een basale hashfunctie:
def simple_hash(text, modulus=1000000007):
"""A very simple hash function using modulo."""
hash_value = 0
for char in text:
# Combine the current hash with the character's Unicode code point
hash_value = (hash_value * 31 + ord(char)) % modulus
return hash_value
# Test with some strings
print(simple_hash("hello")) # Output a number between 0 and 1000000006
print(simple_hash("world"))
print(simple_hash("hello world"))
print(simple_hash("こんにちは"))
99162322
113318802
204910434
807637228
Dit is een heel basaal voorbeeld; echte cryptografische hashing is veel complexer. De modulo-bewerking zorgt ervoor dat de hashwaarde binnen een beheersbaar bereik blijft, terwijl de eigenschappen van een goede hashfunctie behouden blijven.
Modulo is handig voor tijdsberekeningen, zoals het omzetten van grote aantallen uren naar standaard tijdsformaten.
def convert_to_12_hour_format(hours):
return hours % 12 or 12 # Ensure 0 maps to 12
# Example
print(convert_to_12_hour_format(13)) # Output: 1
print(convert_to_12_hour_format(24)) # Output: 12
print(convert_to_12_hour_format(36)) # Output: 12
Hier zorgt de modulo-operator voor het "omslag" van uren in een 12-uursindeling.
In turn-based games met meerdere spelers kunnen we modulo gebruiken om door spelers te cyclen.
players = ["Alice", "Bob", "Charlie"]
turns = 10
for turn in range(turns):
current_player = players[turn % len(players)]
print(f"Turn {turn + 1}: {current_player}'s move")
Turn 1: Alice's move
Turn 2: Bob's move
Turn 3: Charlie's move
Turn 4: Alice's move
Turn 5: Bob's move
Turn 6: Charlie's move
Turn 7: Alice's move
Turn 8: Bob's move
Turn 9: Charlie's move
Turn 10: Alice's move
Veel barcodesystemen gebruiken modulo-bewerkingen om fouten in gescande nummers te detecteren.
def is_valid_isbn13(isbn):
digits = [int(d) for d in str(isbn)]
checksum = sum(d * (1 if i % 2 == 0 else 3) for i, d in enumerate(digits))
return checksum % 10 == 0
# Example ISBN Checksum validation
print(is_valid_isbn13(9780306406157)) # Output: True
print(is_valid_isbn13(9780306406158)) # Output: False
True
False
De modulo-operator is een veelzijdig hulpmiddel in Pythons arsenaal dat veel verder gaat dan simpele restberekeningen. Van het bepalen van even/oneven tot het implementeren van complexe algoritmen met cyclische patronen: modulo maakt schonere, elegantere oplossingen mogelijk voor allerlei programmeeruitdagingen.
Door zowel de basisfunctionaliteit als het genuanceerde gedrag met verschillende soorten getallen te begrijpen, kun je de modulo-operator inzetten om efficiëntere en beter leesbare code te schrijven. De volgende keer dat je logica bouwt met cycli, rotaties of periodieke gebeurtenissen, denk dan aan de modulo-operator als mogelijke oplossing.
Wil je meer leren over hoe je Python inzet voor je projecten? Bekijk dan onze interactieve cursus Introduction to Data Science in Python.
In Python, wanneer je de modulo-operator met negatieve getallen gebruikt, heeft de uitkomst hetzelfde teken als de deler.
Ja, de modulo-operator werkt met kommagetallen, maar let op kleine afrondingsfouten door de manier waarop floats in computers worden weergegeven.
De modulo-operator wordt in diverse realistische toepassingen gebruikt, zoals hashingfuncties, kloktijdberekeningen en foutdetectie zoals ISBN-validatie.
De modulo-operator is cruciaal voor het oplossen van problemen met periodiciteit, deling en "omslag", en is daarmee een veelzijdig hulpmiddel voor efficiënte code en algoritme-ontwerp.
Als oprichter van Martin Data Solutions en freelance data scientist, ML- en AI-engineer heb ik een divers portfolio in regressie, classificatie, NLP, LLM, RAG, neurale netwerken, ensemblemethoden en computer vision.
In elk project dat ik aanpak, pas ik actuele praktijken uit software-engineering en DevOps toe, zoals CI/CD, codelinting, formattering, modelmonitoring, experimenttracking en robuuste foutafhandeling. Ik zet me in om complete oplossingen te leveren en data-inzichten te vertalen naar praktische strategieën die bedrijven helpen groeien en het maximale halen uit data science, machine learning en AI.
Topcursussen Python
Leerpad
Cursus
Cursus

blog
Adel Nehme
15 min