Post Image

Python è uno dei linguaggi di programmazione più amati al mondo. È considerato semplice, intuitivo, perfetto per chi inizia. Eppure, anche con Python, dopo poche righe di codice… arrivano loro: gli errori. Chiunque abbia programmato almeno una volta in vita sua conosce quella sensazione: lanci il tuo script, ti aspetti che funzioni alla perfezione e invece sullo schermo appare una riga rossa minacciosa. Errori incomprensibili, sigle strane, termini criptici. La verità, però, è che gli errori non sono il nemico. Sono guide, messaggi che Python ci manda per dirci esattamente dove abbiamo sbagliato. Se impariamo a leggerli con calma, diventano i nostri migliori alleati. In questo articolo vedremo insieme i 10 errori più comuni in Python, capiremo cosa significano, perché compaiono e soprattutto come risolverli. Alla fine avrai un vero e proprio “vocabolario degli errori”, pronto da consultare ogni volta che il tuo codice si ferma.

Errori di Sintassi e di Indentazione in Python

Quando si inizia a programmare in Python, è praticamente impossibile non imbattersi presto in due tipi di errori molto frequenti: gli errori di sintassi (SyntaxError) e gli errori di indentazione (IndentationError). Sono i primi a comparire sul nostro schermo quando qualcosa “non torna” nel codice, e anche se possono sembrare misteriosi, in realtà sono ottimi alleati: ci segnalano esattamente dove abbiamo sbagliato.

SyntaxError – L’Errore di Sintassi

Il SyntaxError è l’errore più comune, il più famoso e quasi sicuramente il primo che incontrerai nel tuo viaggio con Python. Compare ogni volta che scrivi qualcosa che non rispetta le regole grammaticali del linguaggio, un po’ come fare un errore di ortografia in una frase in italiano.

Esempio classico:

print("Ciao"

Messaggio di errore:

SyntaxError: unexpected EOF while parsing

Cosa significa? Significa che Python si aspettava di trovare ancora qualcosa — magari una parentesi di chiusura, un’apice, un due punti o una virgola — ma il codice è finito prima del previsto. In altre parole, il parser di Python (cioè il componente che legge e interpreta il codice) si è fermato perché ha trovato una “frase” incompleta.

Come risolvere un SyntaxError

  • Controlla la punteggiatura del codice: verifica sempre che tutte le parentesi tonde, quadre o graffe siano aperte e chiuse correttamente, e che le stringhe abbiano sia l’apertura che la chiusura con le virgolette.
  • Usa un editor con evidenziazione della sintassi: oggi quasi tutti gli editor colorano il codice in base al suo significato. Se qualcosa non è colorato nel modo giusto, è spesso il segnale che manca una parentesi o una virgolette.
  • Leggi con calma il messaggio di errore: anche se può sembrare criptico, Python ti indica sempre la riga esatta in cui si è bloccato e spesso anche una breve descrizione del problema. Basta seguirne le tracce per capire dov’è il punto critico.

IndentationError – L’Errore di Indentazione

Python è un linguaggio elegante e leggibile, ma ha una particolarità: l’indentazione non è solo una questione estetica, è parte integrante della sintassi! In molti altri linguaggi, come C o Java, l’indentazione serve solo per rendere il codice più ordinato. In Python, invece, essa definisce la struttura logica dei blocchi di codice.

Esempio:

def saluta():
print("Ciao")

Messaggio di errore:

IndentationError: expected an indented block

Cosa succede qui? Dopo aver definito la funzione saluta(), Python si aspettava di trovare un blocco di istruzioni indentato, cioè rientrato di qualche spazio. Siccome la riga print("Ciao") è allineata al margine sinistro, il linguaggio non riesce a capire che fa parte della funzione — e quindi si lamenta.

Come risolvere un IndentationError

  • Sii coerente con l’indentazione: decidi se usare spazi o tabulazioni e mantieni sempre la stessa scelta in tutto il file. La convenzione più diffusa (e raccomandata) è 4 spazi per ogni livello di rientro.
  • Verifica tutti i blocchi di controllo: ogni costrutto come if, for, while, def o class deve sempre avere un blocco di codice indentato al suo interno.
  • Ricorda il principio chiave: in Python l’indentazione non serve solo a fare bello il codice — serve a dare un senso logico al programma. È ciò che permette al linguaggio di capire dove inizia e dove finisce un’istruzione, una funzione o un ciclo.

In sintesi

Gli errori di sintassi e di indentazione sono i “primi maestri” del programmatore Python: sembrano ostacoli, ma in realtà ci insegnano a scrivere codice più chiaro, ordinato e leggibile. Ogni volta che li incontri, non scoraggiarti: leggili come un messaggio che ti guida verso una forma di pensiero più rigorosa e precisa. In fondo, Python è un linguaggio che premia la chiarezza mentale tanto quanto la precisione tecnica.

Errori di Sintassi e di Indentazione

Ogni linguaggio di programmazione ha le proprie regole grammaticali, e Python non fa eccezione. Quando scriviamo codice, comunichiamo con un interprete che si aspetta istruzioni precise, coerenti e ben formattate. Basta una parentesi mancante, una riga mal allineata o una parola fuori posto perché Python si fermi e ci segnali un errore.

Tra i primi ostacoli che si incontrano imparando a programmare ci sono proprio gli errori di sintassi e gli errori di indentazione. Il loro compito è avvisarci che qualcosa, nel modo in cui abbiamo scritto il codice, non rispetta la struttura che Python si aspetta.

Anziché considerarli nemici, è utile pensarli come strumenti di apprendimento: ci costringono a scrivere in modo più ordinato, preciso e leggibile. Capire come leggerli e risolverli è il primo passo per diventare programmatori più consapevoli e autonomi.

NameError – Quando il nome non esiste

Il NameError si verifica ogni volta che provi a usare una variabile o un identificatore che Python non conosce, cioè che non è stato ancora definito nel contesto in cui ti trovi. È come pronunciare il nome di qualcuno in una stanza in cui quella persona non c’è: il linguaggio si ferma e ti avvisa che non ha idea di cosa tu stia parlando.

Esempio:

print(nome)

Messaggio di errore:

NameError: name 'nome' is not defined

In questo caso, stai chiedendo a Python di stampare il valore della variabile nome, ma tale variabile non è mai stata creata. Il linguaggio, giustamente, non può inventarsi un valore e segnala l’errore.

Come risolvere:

  • Assicurati che la variabile sia stata definita prima di utilizzarla. Se la stai creando dentro una funzione o un blocco, verifica che sia accessibile da dove la richiami.
  • Fai attenzione agli errori di battitura: in Python le variabili sono sensibili alle maiuscole e alle minuscole, quindi nome e Nome sono due nomi diversi.
  • Se non sei sicuro di cosa sia già presente in memoria, puoi usare funzioni utili come dir() o globals() per elencare tutte le variabili e gli oggetti attualmente definiti.

TypeError – Quando i tipi non si capiscono

Il TypeError compare quando cerchi di combinare o manipolare oggetti di tipi incompatibili. È un errore che segnala un’incomprensione logica tra le entità che stai cercando di far interagire: ad esempio, un numero e una stringa non possono essere sommati direttamente, perché Python non sa come interpretare quella richiesta.

Esempio:

numero = 5
testo = "ciao"
print(numero + testo)

Messaggio di errore:

TypeError: unsupported operand type(s) for +: 'int' and 'str'

In questo caso, l’operatore + funziona perfettamente sia tra numeri (dove indica una somma), sia tra stringhe (dove indica una concatenazione). Tuttavia, quando provi ad applicarlo a un numero e a una stringa insieme, Python non sa quale comportamento scegliere e genera l’errore.

Come risolvere:

  • Effettua conversioni esplicite tra tipi quando necessario. Ad esempio, se vuoi unire un numero a una stringa, puoi scrivere:

    print(str(numero) + testo)
    

In questo modo dici chiaramente a Python che vuoi trasformare il numero in testo prima di concatenarlo.

  • Usa la funzione type() per verificare il tipo di una variabile e capire se stai operando con i tipi corretti.
  • Ricorda che Python non tenta di “indovinare” le tue intenzioni: se vuoi combinare tipi diversi, devi essere tu a indicargli come farlo.

ValueError – Quando il valore non ha senso

Il ValueError è strettamente imparentato con il TypeError, ma la causa è diversa. Qui il tipo di dato è corretto, ma il valore contenuto non è adatto all’operazione richiesta. È come se dicessi a Python: “trasforma questa parola in un numero”. Il linguaggio ti risponde che non può farlo, non perché il tipo sia sbagliato, ma perché il valore non è interpretabile come numero.

Esempio:

int("ciao")

Messaggio di errore:

ValueError: invalid literal for int() with base 10: 'ciao'

Il tipo di dato di partenza è corretto (una stringa), e la funzione int() sa come gestire stringhe che rappresentano numeri, ma in questo caso la parola “ciao” non è un numero valido. Python, coerentemente, solleva un ValueError.

Come risolvere:

  • Verifica sempre che i dati abbiano il formato corretto prima di convertirli o elaborarli.

  • Quando i dati provengono da input esterni, come quelli inseriti dall’utente o letti da un file, è buona pratica gestire le eccezioni con un blocco try/except. In questo modo puoi intercettare l’errore ed evitare che il programma si interrompa:

    try:
        numero = int("ciao")
    except ValueError:
        print("Impossibile convertire in intero")
    

In questo modo il programma continua a funzionare anche se i dati non sono nel formato previsto.

Errori su Liste e Dizionari

Dopo aver preso dimestichezza con le basi della sintassi, uno degli ostacoli più frequenti per chi programma in Python riguarda le strutture dati, in particolare liste e dizionari. Questi strumenti sono potenti e flessibili, ma proprio per questo è facile commettere errori se non si ha ancora chiaro come funzionano gli indici e le chiavi. Python è molto preciso nel segnalare quando si tenta di accedere a un elemento che non esiste: in quei casi ci restituisce errori come IndexError o KeyError. Imparare a riconoscerli e a interpretarli è fondamentale per gestire in modo sicuro e consapevole i dati in memoria.

IndexError – Quando l’indice non esiste

L’IndexError si verifica ogni volta che provi ad accedere a una posizione che non esiste all’interno di una lista, di una tupla o di una stringa. Python numerando gli elementi a partire da zero, considera valida solo una gamma di indici che va da 0 al numero di elementi meno uno. Se provi a usare un indice fuori da questi limiti, il linguaggio non può restituirti alcun valore e genera l’errore.

Esempio:

lista = [1, 2, 3]
print(lista[5])

Messaggio di errore:

IndexError: list index out of range

In questo caso, la lista contiene tre elementi (con indici 0, 1 e 2), ma il codice tenta di accedere all’indice 5, che non esiste. Python lo segnala chiaramente con il messaggio “index out of range”.

Come risolvere:

  • Controlla sempre la lunghezza della lista con la funzione len(), ad esempio len(lista), prima di accedere a un indice variabile.

  • Ricorda che gli indici partono da 0: il primo elemento non è [1], ma [0].

  • Quando possibile, evita di accedere manualmente agli indici e preferisci cicli o operazioni di slicing, che riducono il rischio di errori. Ad esempio:

    for elemento in lista:
        print(elemento)
    

    oppure

    print(lista[:3])
    

In questo modo Python gestisce automaticamente i limiti della sequenza.

KeyError – Quando la chiave non è presente

Il KeyError si manifesta quando cerchi di accedere a una chiave che non esiste all’interno di un dizionario. A differenza delle liste, che usano indici numerici, i dizionari associano a ogni valore una chiave univoca. Se provi a interrogare il dizionario con una chiave che non è stata definita, Python non sa cosa restituire e solleva un errore.

Esempio:

diz = {"nome": "Luca"}
print(diz["eta"])

Messaggio di errore:

KeyError: 'eta'

Il dizionario diz contiene solo una chiave, "nome", ma il codice tenta di accedere a "eta", che non è presente. Python interrompe l’esecuzione e segnala chiaramente quale chiave manca.

Come risolvere:

  • Usa il metodo .get() per accedere in modo sicuro a una chiave, specificando un valore di default da restituire nel caso in cui la chiave non esista. Ad esempio:

    print(diz.get("eta", "Chiave non trovata"))
    

    In questo modo il programma non genera un errore, ma restituisce un messaggio alternativo.

  • Prima di accedere a una chiave, puoi verificare la sua presenza con un semplice controllo:

    if "eta" in diz:
        print(diz["eta"])
    

Questo approccio evita interruzioni e rende il codice più robusto.

Errori su Oggetti e Moduli

Man mano che si procede nello studio di Python, ci si imbatte in un altro gruppo di errori legati non più alla sintassi o ai dati, ma al modo in cui utilizziamo gli oggetti e i moduli. Python è un linguaggio orientato agli oggetti: ogni elemento — che sia un numero, una stringa, una lista o un dizionario — appartiene a una precisa classe e possiede attributi e metodi specifici. Se tentiamo di accedere a un metodo che quell’oggetto non ha, o se proviamo a importare un modulo che non esiste, il linguaggio reagisce segnalando un errore. Questi errori, apparentemente tecnici, sono in realtà preziosi indizi che ci aiutano a capire meglio la struttura interna del linguaggio e la logica degli oggetti che lo compongono.

AttributeError – Quando un oggetto non ha ciò che cerchi

Un AttributeError si verifica quando tenti di usare un metodo o un attributo che non esiste per il tipo di oggetto su cui stai lavorando. Ogni oggetto in Python ha un insieme definito di funzioni e proprietà. Se provi a richiamarne una che non fa parte di quel tipo, Python ti ferma con un messaggio di errore.

Esempio:

numero = 10
numero.append(5)

Messaggio di errore:

AttributeError: 'int' object has no attribute 'append'

Qui il problema è chiaro: il metodo append() è valido per le liste, ma non per gli interi. L’oggetto numero è di tipo int, e quindi non possiede un metodo con quel nome.

Come risolvere:

  • Usa la funzione type() per verificare di che tipo è l’oggetto su cui stai lavorando. Ad esempio:

    print(type(numero))
    

    ti aiuterà a capire se stai operando sull’oggetto giusto.

  • Consulta la documentazione ufficiale o l’aiuto integrato con help() per conoscere quali metodi e attributi appartengono a quel tipo di oggetto.

  • Ricorda che non tutti gli oggetti possiedono gli stessi metodi: un numero, una stringa o una lista possono sembrare simili in alcuni comportamenti, ma ognuno di essi ha funzionalità diverse.

ImportError e ModuleNotFoundError – Quando il modulo non si trova

Gli errori ImportError e ModuleNotFoundError si presentano quando provi a importare un modulo che non esiste, non è installato oppure non è accessibile nel contesto corrente. In Python, ogni volta che scriviamo import, chiediamo al linguaggio di cercare un modulo esterno da caricare in memoria. Se il nome è sbagliato o il pacchetto non è disponibile, l’importazione fallisce.

Esempio:

import panda

Messaggio di errore:

ModuleNotFoundError: No module named 'panda'

In questo caso, l’errore è dovuto a un semplice errore di battitura: il modulo corretto si chiama pandas, non panda. Python, non trovando alcun pacchetto con quel nome, solleva l’eccezione.

Come risolvere:

  • Verifica sempre l’ortografia del nome del modulo. Anche una sola lettera sbagliata può impedire l’importazione.

  • Se il modulo non è installato, puoi aggiungerlo al tuo ambiente con il comando:

    pip install pandas
    

    (sostituendo “pandas” con il nome del modulo desiderato).

  • Se lavori con ambienti virtuali, assicurati che il modulo sia installato nell’ambiente corretto. È possibile che un pacchetto installato globalmente non sia disponibile all’interno di un ambiente isolato, o viceversa.

Divisioni Impossibili

Tra tutti gli errori che possono verificarsi in un programma, ce n’è uno che accomuna principianti e professionisti: la divisione per zero. In matematica, dividere un numero per zero è un’operazione priva di significato — e Python, coerentemente, si rifiuta di eseguirla. Quando ciò accade, il linguaggio genera un errore specifico: ZeroDivisionError. Si tratta di un errore semplice da capire, ma che può comparire facilmente, soprattutto quando i valori coinvolti nella divisione provengono da input esterni o da calcoli complessi.

Il ZeroDivisionError viene sollevato quando tenti di eseguire un’operazione di divisione in cui il divisore è uguale a zero. Python, come qualsiasi sistema logico, non può rappresentare il risultato di una divisione per zero e quindi interrompe l’esecuzione segnalando l’errore.

Esempio:

x = 10 / 0

Messaggio di errore:

ZeroDivisionError: division by zero

In questo caso, il programma tenta di calcolare 10 / 0, ma la divisione non è matematicamente definita, e l’interprete interrompe l’esecuzione per evitare un risultato privo di senso.

Come risolvere:

  • Aggiungi sempre un controllo sul denominatore prima di effettuare la divisione. Ad esempio:

    if y != 0:
        print(x / y)
    else:
        print("Divisione per zero non consentita")
    

    In questo modo il programma verifica la validità dell’operazione prima di eseguirla.

  • Se i valori derivano da input esterni o da calcoli intermedi, può essere utile gestire la situazione anche con un blocco try/except, per esempio:

    try:
        risultato = x / y
    except ZeroDivisionError:
        print("Errore: impossibile dividere per zero")
    

    In questo modo l’errore non blocca il programma e può essere gestito in modo elegante.

Conclusione

Ora che hai fatto un giro panoramico tra i principali errori di Python, la domanda naturale è: cosa fare, concretamente, quando sullo schermo compare un errore? Invece di viverlo come un fallimento, puoi trattarlo come un messaggio strutturato che ti indica esattamente dove guardare. Ecco una piccola guida operativa per affrontarli con metodo.

  1. Leggi il messaggio per intero Non fermarti alla prima riga né limitarti a pensare “non funziona”. Il messaggio di errore contiene almeno due informazioni fondamentali:

    • il tipo di errore (ad esempio SyntaxError, TypeError, IndexError…),
    • la riga di codice in cui l’interprete si è fermato. Spesso, subito sotto, trovi anche una freccia che indica il punto approssimativo in cui il parser ha avuto problemi. Prenditi il tempo per leggere tutto: alcune volte la soluzione è letteralmente scritta lì.
  2. Non andare nel panico Gli errori non sono un segnale che “non sei portato”, ma la condizione normale di chi programma. Qualsiasi sviluppatore, a qualsiasi livello, vede errori ogni giorno. La differenza non sta nel non sbagliare, ma nel non farsi bloccare: l’errore è un feedback, non un giudizio.

  3. Osserva il comportamento del programma: print e debugger Se non capisci subito dov’è il problema, prova a “illuminare” il flusso del codice:

    • inserisci print() strategici per vedere il contenuto delle variabili nei punti chiave,
    • oppure usa un debugger per eseguire il programma passo per passo, controllando a ogni step cosa succede. Questo ti permette di passare da “non funziona” a “in questo punto succede qualcosa di diverso da quello che mi aspettavo”.
  4. Cerca online in modo mirato Se l’errore continua a non essere chiaro, non esitare a cercare il messaggio esatto su Internet. Spesso basta copiare e incollare la riga di errore (magari aggiungendo “python” alla ricerca) per trovare discussioni e soluzioni su siti come Stack Overflow. È importante però non limitarsi a copiare la soluzione: leggi la spiegazione e prova a capire perché quella modifica risolve il problema.

  5. Impara qualcosa da ogni errore Ogni volta che correggi un errore, chiediti: “Come faccio a evitare lo stesso errore la prossima volta?” Con il tempo, inizierai a riconoscere i pattern: saprai che un certo tipo di messaggio indica quasi sempre una parentesi mancante, una variabile non definita, un indice fuori range e così via. Più errori incontri, più diventi rapido nel prevederli e prevenirli.

Ogni errore in Python può essere visto come un insegnante severo ma imparziale: non ti lascia passare nulla, ma ti indica con precisione dove qualcosa non torna. La vera svolta sta nel cambiare prospettiva: smettere di considerarli ostacoli personali e iniziare a leggerli come suggerimenti tecnici. Un programmatore esperto non è qualcuno che non sbaglia mai, ma qualcuno che ha imparato a leggere, interpretare e risolvere gli errori in tempi brevi, trasformandoli in informazioni utili.

In conclusione, gli errori in Python non sono una punizione, ma una forma di comunicazione che il linguaggio usa per dialogare con te. Dal SyntaxError al ZeroDivisionError, ogni messaggio contiene indizi preziosi per rendere il tuo codice più preciso, robusto e leggibile. La prossima volta che vedi comparire una riga rossa sullo schermo, resisti alla tentazione di irritarti: fermati un momento, leggi con calma, ragiona su ciò che il linguaggio ti sta dicendo. Quello che oggi ti appare come un ostacolo è, in realtà, un invito a migliorare. E, in fondo, ogni bug risolto è davvero un livello in più nella tua crescita come programmatore.