Introduzione
Quando si scrive codice Python reale, non tutti i dati arrivano già puliti e completi. Spesso una variabile può essere valorizzata, vuota oppure assente. Pensiamo a dati letti da un file di configurazione, a input utente, a valori provenienti da un’API o a campi di un dizionario. In questi casi, saper usare bene variabili e operatori è fondamentale per evitare errori e rendere il programma più robusto.
In questo tutorial vedremo un sotto-argomento molto pratico: come gestire valori opzionali e fallback usando assegnazioni, confronti e operatori logici. L’obiettivo è imparare a scrivere codice che scelga automaticamente un valore predefinito quando quello principale non è disponibile, senza complicare troppo la logica.
Questo tema è utile in moltissimi scenari:
- impostare valori di default in una configurazione;
- gestire input mancanti da parte dell’utente;
- evitare errori quando un dato può essere None;
- semplificare condizioni e aggiornamenti di variabili.
Codice completo
# Esempio: gestione di valori opzionali e fallback
def scegli_nome_visualizzato(nome_input, username, default="Utente"):
# Se nome_input è una stringa non vuota, la usiamo.
# Altrimenti proviamo con username.
# Se anche username non è valido, usiamo il default.
return nome_input or username or default
def normalizza_soglia(soglia):
# Se soglia è None, assegniamo un valore di default.
# Se soglia è già presente, la lasciamo invariata.
if soglia is None:
soglia = 10
return soglia
def descrivi_profilo(eta, città=None, newsletter=False):
# Costruiamo una descrizione leggibile usando variabili e operatori logici.
stato_newsletter = "iscritto" if newsletter else "non iscritto"
# Attenzione: città può essere None o stringa vuota.
luogo = città or "città non specificata"
# Usiamo il confronto per classificare l´età.
if eta < 18:
fascia = "minorenne"
elif eta < 65:
fascia = "adulto"
else:
fascia = "senior"
return f"{fascia}, residente a {luogo}, newsletter {stato_newsletter}"
# ----------------------------
# Esempi di utilizzo
# ----------------------------
nome_1 = scegli_nome_visualizzato("Luca", "lucas92")
nome_2 = scegli_nome_visualizzato("", "lucas92")
nome_3 = scegli_nome_visualizzato(None, None)
soglia_a = normalizza_soglia(None)
soglia_b = normalizza_soglia(25)
profilo_1 = descrivi_profilo(17, "Torino", True)
profilo_2 = descrivi_profilo(34, "", False)
profilo_3 = descrivi_profilo(72)
print("Nome 1:", nome_1)
print("Nome 2:", nome_2)
print("Nome 3:", nome_3)
print("Soglia A:", soglia_a)
print("Soglia B:", soglia_b)
print("Profilo 1:", profilo_1)
print("Profilo 2:", profilo_2)
print("Profilo 3:", profilo_3)
# Esempio di aggiornamento sicuro di una variabile
tentativi = 0
limite = 3
if tentativi < limite:
tentativi = tentativi + 1
print("Tentativi aggiornati:", tentativi)
# Esempio di fallback con operatori logici
preferenza_tema = ""
tema_attivo = preferenza_tema or "chiaro"
print("Tema attivo:", tema_attivo) Spiegazione
1. Il valore di fallback con l’operatore or
Uno degli usi più pratici degli operatori in Python è il fallback con or. L’espressione:
valore = opzione_principale or valore_di_riserva restituisce la prima parte se è “vera” dal punto di vista booleano; altrimenti passa alla seconda. Questo è molto utile quando la variabile può essere una stringa vuota, None o un altro valore considerato falso.
Per esempio:
- "Luca" è un valore valido, quindi viene mantenuto;
- "" è una stringa vuota, quindi il codice usa il fallback;
- None non rappresenta un dato utile, quindi si passa al default.
Nel codice, la funzione scegli_nome_visualizzato usa proprio questa logica per selezionare il nome migliore disponibile.
2. Distinguere tra None e altri valori falsi
Non sempre basta usare or. In alcuni casi vogliamo trattare solo None come “assenza di valore”, ma accettare altri valori falsi come 0 o False. Per questo è meglio usare il confronto esplicito:
if soglia is None:
soglia = 10 Qui il controllo con is None è molto più preciso di if not soglia. Infatti:
- 0 potrebbe essere un valore valido;
- False potrebbe essere una scelta intenzionale;
- None indica chiaramente “nessun valore assegnato”.
Questa distinzione è una buona pratica importante quando si lavora con parametri opzionali o dati provenienti dall’esterno.
3. Confronti per prendere decisioni
Gli operatori di confronto come <, >, == e != servono a confrontare variabili e decidere quale ramo di codice eseguire. Nella funzione descrivi_profilo, l’età viene classificata in fasce usando una struttura if / elif / else.
Questo approccio rende il codice leggibile e facile da estendere. Se domani volessimo aggiungere una nuova fascia, potremmo farlo in modo ordinato.
4. Operatore ternario per assegnazioni compatte
La riga:
stato_newsletter = "iscritto" if newsletter else "non iscritto" usa l’operatore ternario. È una forma compatta di if/else molto utile quando dobbiamo assegnare un valore a una variabile in base a una condizione semplice.
È preferibile usarlo solo quando la logica è breve e immediata. Se la condizione diventa troppo articolata, meglio tornare a un blocco if tradizionale per mantenere il codice chiaro.
5. Aggiornare una variabile in modo sicuro
Nel codice troviamo anche un esempio classico di aggiornamento:
tentativi = tentativi + 1 Questo è un caso semplice, ma mostra bene come le variabili vengano lette, elaborate e riassegnate. In Python è possibile anche scrivere:
tentativi += 1 che è una forma più compatta e leggibile. Gli operatori di assegnazione composta sono molto usati quando si aggiornano contatori, punteggi o accumulatori.
Best practice
- Usa
orper fallback semplici, ma solo quando i valori falsi sono davvero da considerare “mancanti”. - Usa
is Noneper controlli precisi quando devi distinguere tra assenza di valore e valore falso valido. - Preferisci nomi chiari per le variabili, come
tema_attivooluogo, invece di abbreviazioni poco leggibili. - Evita condizioni troppo complesse in una sola riga: il codice deve essere facile da capire anche dopo settimane.
- Usa l’operatore ternario con moderazione: è utile per assegnazioni brevi, non per logiche complesse.
- Commenta le decisioni non ovvie, soprattutto quando scegli un default o gestisci casi speciali.
- Non confondere
Nonecon stringhe vuote o zero: sono situazioni diverse e vanno trattate con attenzione.
Riepilogo
In questo tutorial abbiamo visto come usare variabili e operatori per gestire valori opzionali e fallback in modo sicuro. I concetti chiave sono:
- or è perfetto per scegliere un valore alternativo in modo rapido;
- is None è il controllo giusto quando vuoi distinguere l’assenza di valore da altri casi;
- gli operatori di confronto aiutano a prendere decisioni chiare;
- l’operatore ternario rende compatte le assegnazioni condizionali semplici;
- gli operatori di assegnazione come += semplificano gli aggiornamenti delle variabili.
Queste tecniche sono piccole, ma fanno una grande differenza nella qualità del codice. Rendono i programmi più robusti, leggibili e facili da mantenere.
Approfondisci con risorse ufficiali
- Python Documentation - Expressions: documentazione ufficiale sulle espressioni e sugli operatori.
- Python Documentation - Data Model: utile per capire il comportamento booleano degli oggetti in Python.
- Python Documentation - Built-in Types: per approfondire stringhe, numeri, booleani e None.
- PEP 8: guida ufficiale allo stile del codice Python, molto utile per scrivere espressioni chiare e leggibili.
Se vuoi, nel prossimo passo posso trasformare questo tutorial in una lezione con esercizi oppure in una versione più avanzata con esempi su dizionari, input utente e configurazioni.
