Programma
L’operatore modulo (%) in Python è un operatore aritmetico fondamentale usato per determinare il resto di un’operazione di divisione. Pur essendo semplice nel concetto, svolge un ruolo cruciale in molte applicazioni di programmazione. Dal verificare se un numero è pari o dispari, al ciclare attraverso sequenze e determinare gli anni bisestili, padroneggiare l’operatore modulo può migliorare le tue capacità di problem solving in Python.
Capire l’operatore modulo è essenziale perché compare spesso in:
- Identificazione di numeri pari e dispari
- Iterazione ciclica degli elementi
- Implementazione di calcoli matematici in aritmetica modulare
- Applicazioni pratiche reali come calcoli di date, crittografia e logica di gioco.
In questo blog troverai una guida completa all’uso dell’operatore modulo in Python, con sintassi, comportamento con diversi tipi numerici, casi d’uso ed esempi pratici. Se sei alle prime armi con Python, valuta il nostro corso Introduzione a Python.
Che cos’è l’operatore Modulo in Python?
L’operatore modulo (%) calcola il resto della divisione tra due numeri. Dati due numeri a (dividendo) e b (divisore), l’operazione modulo restituisce il resto quando a è diviso per b.
Contesto matematico
Il modulo affonda le sue radici nell’aritmetica modulare, un sistema aritmetico per gli interi in cui i numeri “ricominciano da capo” dopo aver raggiunto un certo valore (modulo). È ampiamente usato in crittografia, hashing e calcoli ciclici.
Pensa a un orologio a 12 ore: dopo le 12, invece di proseguire a 13, si torna a 1. Questo è, in sostanza, aritmetica modulare con modulo 12:
13 % 12 = 1, ovvero le 13 corrispondono all’1 nel formato a 12 ore.
Sintassi del Modulo in Python e uso di base
In Python, l’operatore modulo segue una sintassi semplice:
remainder = dividend % divisor
Vediamo alcuni esempi base:
# Basic modulo operations
print(7 % 3)
print(15 % 4)
print(20 % 5)
1
3
0
Quando dividiamo 7 per 3, otteniamo 2 con un resto di 1. L’operatore modulo ci restituisce quel resto. Allo stesso modo, 15 diviso per 4 dà 3 con resto 3, e 20 diviso per 5 dà esattamente 4 senza resto.
Lavorare con gli interi
Ora che abbiamo visto le basi dell’operatore modulo, esploriamo come si comporta con gli interi.
Modulo con interi positivi
Lavorare con interi positivi è il caso d’uso più lineare per l’operatore modulo:
# Examples with positive integers
print(10 % 3)
print(25 % 7)
print(100 % 10)
1
4
0
In questi esempi, possiamo calcolare i risultati trovando quante volte il divisore entra nel dividendo e poi determinando cosa resta:
- 10 ÷ 3 = 3 resto 1, quindi 10 % 3 = 1
- 25 ÷ 7 = 3 resto 4, quindi 25 % 7 = 4
- 100 ÷ 10 = 10 resto 0, quindi 100 % 10 = 0
Modulo con interi negativi
Il comportamento dell’operatore modulo diventa più interessante con i numeri negativi. Python segue una regola specifica: il risultato di a % b ha sempre lo stesso segno di b (il divisore).
# Examples with negative integers
print(-10 % 3)
print(10 % -3)
print(-10 % -3)
2
-2
-1
Questi risultati possono sembrare controintuitivi a prima vista, ma seguono una regola coerente:
- Per
-10 % 3: invece di ottenere -1 (che potresti aspettarti pensando a -10 ÷ 3 = -3 resto -1), Python restituisce 2. Questo perché Python cerca un valore tra 0 e 3 (escluso) che, aggiunto a un multiplo di 3, dia -10. La risposta è 2, perché -12 + 2 = -10. - Per
10 % -3: il risultato ha lo stesso segno del divisore (-3), quindi otteniamo -2. Questo perché 10 = (-3) × (-4) + (-2). - Per
-10 % -3: il risultato è -1, perché -10 = (-3) × 3 + (-1).
Capire come Python gestisce i numeri negativi nelle operazioni modulo è cruciale quando lavori con calcoli ciclici, come:
- Implementazione di funzioni di hashing
- Risoluzione di problemi di aritmetica “a orologio”
- Gestione di logiche di indicizzazione negativa nelle liste
Uso del Modulo con numeri in virgola mobile
L’operatore modulo di Python non è limitato agli interi; funziona anche con numeri in virgola mobile:
# 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
Con i floating point, l’operazione modulo segue lo stesso principio: restituisce il resto dopo la divisione. Tuttavia, per via del modo in cui i numeri in virgola mobile sono rappresentati nei computer (formato IEEE 754), possono verificarsi piccoli errori di arrotondamento.
Per esempio, invece di 1.3, Python restituisce 1.299999999999999, e invece di 0.2 restituisce 0.19999999999999973. Queste piccole imprecisioni sono comuni nell’aritmetica in virgola mobile e vanno considerate quando servono calcoli precisi.
Python offre anche la funzione math.fmod() dal modulo math come alternativa per operazioni di modulo in virgola mobile, che può gestire in modo diverso alcuni casi limite:
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
La differenza principale tra % e math.fmod() riguarda la gestione dei numeri negativi. Mentre % garantisce che il risultato abbia lo stesso segno del divisore e restituisce un valore nell’intervallo [0, divisore), math.fmod() garantisce che il risultato abbia lo stesso segno del dividendo. Questa distinzione è importante nelle applicazioni in cui il segno del resto conta.
Quindi, quando usare % e quando math.fmod()?
- Usa
%quando ti serve un comportamento coerente del segno (ad esempio, per ciclare in un intervallo). - Usa
math.fmod()quando va preservato il segno del dividendo, come in simulazioni fisiche o funzioni matematiche.
Gestione dei numeri negativi nel modulo di Python
Come visto negli esempi precedenti, l’implementazione dell’operatore modulo con numeri negativi in Python potrebbe non allinearsi all’intuizione iniziale. Esploriamo questo comportamento in modo più sistematico:
# 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
Nota lo schema: i risultati si ripetono ciclicamente 0 → 1 → 2, indipendentemente dal fatto che il dividendo sia positivo o negativo. Questo comportamento coerente rende l’operatore modulo particolarmente utile nei calcoli ciclici, come:
- Rotazione degli indici in array o buffer circolari
- Mapping di valori in funzioni periodiche (ad es. calcoli basati sul tempo)
La formula matematica che Python segue per il modulo è:
Import math
a % b = a - (b * math.floor(a / b))
Questo garantisce che il risultato sia sempre tra 0 e b (escluso) quando b è positivo, o tra b e 0 (escluso) quando b è negativo.
Riepilogo dell’operatore Modulo in Python
L’operatore modulo (%) in Python calcola il resto di un’operazione di divisione. Segue una formula matematica coerente:
a % b = a - (b * math.floor(a / b))
Regole chiave del comportamento del modulo in Python:
- Per divisori positivi (
b > 0) - Il risultato è sempre nell’intervallo
[0, b)(inclusivo di 0, esclusivo dib). - Per divisori negativi (
b < 0) - Il risultato è sempre nell’intervallo
(b, 0](esclusivo dib, inclusivo di0). - Il resto assume lo stesso segno di
b(il divisore). - Funziona sia con interi che con floating point
- Per i numeri in virgola mobile,
%segue la stessa formula ma può introdurre piccoli errori di arrotondamento dovuti alla precisione dei floating point. - Differenza tra
%emath.fmod() %garantisce che il resto abbia lo stesso segno del divisore.math.fmod(a, b)garantisce che il resto abbia lo stesso segno del dividendo.
Casi d’uso comuni dell’operatore Modulo
Vediamo alcune applicazioni pratiche dell’operatore modulo con ulteriori esempi.
Verificare se un numero è pari o dispari
Una delle applicazioni più comuni dell’operatore modulo è determinare se un numero è pari o dispari:
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
Questo funziona perché i numeri pari lasciano un resto di 0 quando divisi per 2, mentre i dispari lasciano un resto di 1 o -1.
Ciclare attraverso una sequenza
L’operatore modulo è perfetto per creare comportamenti ciclici, come ruotare attraverso una lista di elementi:
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 questo esempio, a prescindere da quanto grande o piccolo (negativo) sia n, la funzione restituirà sempre un giorno valido della settimana.
Calcolo degli anni bisestili
Sebbene il calcolo degli anni bisestili coinvolga più condizioni, l’operatore modulo è centrale nell’algoritmo:
Gli anni bisestili seguono una regola precisa:
- Un anno è bisestile se è divisibile per 4.
- Ma se è divisibile per 100, non è bisestile.
- A meno che non sia anche divisibile per 400, allora è bisestile.
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
Questo assicura che le regole del calendario gregoriano sugli anni bisestili siano applicate correttamente.
Esempi pratici di Modulo in Python
Ecco alcuni modi in cui puoi usare l’operatore modulo nei tuoi progetti Python:
Usare il modulo nei loop
L’operatore modulo è spesso usato nei loop per eseguire azioni a intervalli regolari:
# 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!
Questo schema è utile per l’elaborazione a lotti, il reporting di avanzamento o qualsiasi funzionalità che debba avvenire periodicamente.
Modulo in applicazioni reali
Hashing delle password
Nelle applicazioni crittografiche, l’aritmetica modulare è fondamentale. Ecco un esempio semplificato di come il modulo potrebbe essere usato in una funzione di hashing di base:
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
Questo è un esempio molto basilare, perché l’hashing crittografico reale è molto più complesso. L’operazione modulo assicura che il valore di hash resti entro un intervallo gestibile pur mantenendo le proprietà desiderabili di una buona funzione di hash.
Calcolo dell’ora su orologio
Il modulo è utile per gestire i calcoli del tempo, come convertire grandi numeri di ore in formati orari standard.
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
Qui, l’operatore modulo fa “girare” le ore in un formato a 12 ore.
Sviluppo di giochi: implementare un sistema di turni multiplayer
Nei giochi a turni multiplayer, possiamo usare il modulo per ciclare tra i giocatori.
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
Validazione delle cifre nei codici a barre
Molti sistemi di codici a barre usano operazioni di modulo per rilevare errori nei numeri scansionati.
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
Conclusione
L’operatore modulo è uno strumento versatile nell’arsenale di Python che va ben oltre i semplici calcoli di resto. Dal determinare numeri pari/dispari all’implementazione di algoritmi complessi con schemi ciclici, il modulo permette soluzioni più pulite ed eleganti a vari problemi di programmazione.
Capendo sia la funzionalità di base sia il comportamento sfumato con diversi tipi di numeri, puoi sfruttare l’operatore modulo per scrivere codice più efficiente e leggibile. La prossima volta che ti ritrovi a implementare logiche che coinvolgono cicli, rotazioni o eventi periodici, ricorda che l’operatore modulo potrebbe essere la soluzione perfetta.
Se vuoi imparare di più su come usare Python nei tuoi progetti, dai un’occhiata al nostro corso interattivo, Introduzione alla Data Science in Python.
FAQ su Python Modulo
Come funziona l’operatore modulo con numeri negativi in Python?
In Python, usando l’operatore modulo con numeri negativi, il risultato avrà lo stesso segno del divisore.
Si può usare l’operatore modulo con numeri in virgola mobile?
Sì, l’operatore modulo funziona con i numeri in virgola mobile, ma fai attenzione ai piccoli errori di arrotondamento dovuti al modo in cui i float sono rappresentati nei computer.
Come viene usato l’operatore modulo in applicazioni reali?
L’operatore modulo è usato in diverse applicazioni reali, come funzioni di hashing, calcoli dell’ora e rilevamento degli errori come la validazione ISBN.
Perché l’operatore modulo è importante in programmazione?
L’operatore modulo è fondamentale per risolvere problemi che coinvolgono periodicità, divisione e “avvolgimento”, rendendolo uno strumento versatile per un coding efficiente e la progettazione di algoritmi.
Come fondatore di Martin Data Solutions e Data Scientist/ML & AI Engineer freelance, porto un portfolio vario che include Regression, Classification, NLP, LLM, RAG, reti neurali, metodi ensemble e computer vision.
- Ho sviluppato con successo diversi progetti ML end-to-end, includendo data cleaning, analytics, modellazione e deployment su AWS e GCP, offrendo soluzioni efficaci e scalabili.
- Ho realizzato applicazioni web interattive e scalabili con Streamlit e Gradio per casi d’uso in settori diversi.
- Ho insegnato e fatto mentoring a studenti di data science e analytics, supportandone la crescita professionale con approcci di apprendimento personalizzati.
- Ho progettato contenuti didattici per applicazioni di retrieval-augmented generation (RAG) su misura per le esigenze enterprise.
- Ho scritto articoli tecnici di grande impatto su AI & ML, trattando temi come MLOps, database vettoriali e LLM, ottenendo un notevole coinvolgimento.
In ogni progetto che affronto, applico pratiche aggiornate di ingegneria del software e DevOps, come CI/CD, linting del codice, formattazione, monitoraggio dei modelli, tracciamento degli esperimenti e gestione robusta degli errori. Mi impegno a fornire soluzioni complete, trasformando gli insight dai dati in strategie pratiche che aiutano le aziende a crescere e a sfruttare al meglio data science, machine learning e AI.


