Vai al contenuto principale

Operatore Modulo in Python: concetti chiave spiegati

Scopri come usare l'operatore modulo (%) in Python per risolvere problemi reali: dal controllo pari/dispari alla crittografia, fino a strutture dati cicliche.
Aggiornato 29 set 2026  · 9 min leggi

Scopri con l'IA

ChatGPTClaudePerplexity

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:

  1. 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.
  2. Per 10 % -3: il risultato ha lo stesso segno del divisore (-3), quindi otteniamo -2. Questo perché 10 = (-3) × (-4) + (-2).
  3. 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:

  1. Per divisori positivi (b > 0)
    • Il risultato è sempre nell’intervallo [0, b) (inclusivo di 0, esclusivo di b).
  2. Per divisori negativi (b < 0)
    • Il risultato è sempre nell’intervallo (b, 0] (esclusivo di b, inclusivo di 0).
    • Il resto assume lo stesso segno di b (il divisore).
  3. 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.
  4. Differenza tra % e math.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.


Benito Martin's photo
Author
Benito Martin
LinkedIn

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.

Argomenti
Python

I migliori corsi Python

Programma

Fondamenti di dati in Python

28 ore
Accresci le tue competenze sui dati, scopri come manipolarli e visualizzarli e applica analisi avanzate per prendere decisioni basate sui dati.
Vedi i dettagliRight Arrow
Inizia Il Corso
Mostra altroRight Arrow
Correlato

blog

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

blog

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

blog

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

Mostra AltroMostra Altro