2 — Variabili e Tipi di Dati
Obiettivi del modulo
Al termine di questo modulo (3 ore) lo studente sarà in grado di:
-
creare e usare variabili in Python rispettandone le regole di naming e scope;
-
riconoscere i tipi base (
int,float,str,bool) e gestirne le proprietà; -
convertire valori tra tipi in modo sicuro e consapevole;
-
leggere input da tastiera in modo robusto;
-
progettare e implementare una calcolatrice semplice (con attenzione alla sicurezza e alla precisione numerica).
1 — Variabili: cosa sono e regole di naming (20 min)
Concetto
Una variabile è un nome simbolico che fa riferimento a un oggetto in memoria. In Python il binding è dinamico e il linguaggio è dynamically typed (il tipo è associato all’oggetto, non al nome).
Esempio:
Regole di naming (buone pratiche)
-
I nomi validi: lettere (
a–z,A–Z), cifre (0–9) e underscore_. Non possono iniziare con una cifra.Validi:count,_temp,total_3. Invalidi:3items,my-var. -
Case-sensitive:
Value,valuesono nomi distinti. -
Evitare parole chiave riservate (
if,for,while,def,class,lambda,None,True,False, ecc.). Per la lista completa: vedere la documentazione Pythonkeyword.kwlist. -
Convenzione PEP8:
-
variabili e funzioni:
snake_case(es.total_amount) -
costanti (convenzionali):
UPPER_SNAKE_CASE(es.MAX_RETRIES) -
classi:
CamelCase(es.MyClass)
-
-
Usare nomi significativi e non puntare a abbreviazioni criptiche.
Scope (ambito)
-
local(funzioni),global(modulo),builtins. -
Per modificare una variabile globale dentro una funzione usare
global, per variabili del "nonlocal" scope (closure) usarenonlocal. Evitare uso eccessivo diglobal.
Esempio:
2 — Tipi base: numeri e booleani (30 min)
Interi (int)
-
Precisione arbitraria (non overflow in Python 3).
-
Operatori:
+ - * // % **(divisione intera//, modulo%, potenza**).
Esempio:
Virgola mobile (float)
-
Rappresentazione in virgola mobile IEEE-754 (double precision). Attenzione alle proprietà numeriche (errori di rappresentazione).
-
1/3produce0.3333333333333333approssimato.
Problema classico: 0.1 + 0.2 != 0.3 in float.
-
Motivazione (sintesi): alcuni decimali non sono rappresentabili esattamente in base 2; la somma dà
0.30000000000000004. -
Soluzione per applicazioni dove serve precisione decimale: usare il modulo
decimal.Decimal.
Esempio con Decimal:
Numeri complessi (complex)
-
Sintassi:
3+4j. Utile per elaborazione segnali, matematica, alcuni algoritmi scientifici.
Booleani (bool)
-
Valori:
True,False. Sottotipo diint(True== 1,False== 0). -
Valori truthy / falsy:
-
Falsy:
0,0.0,''(stringa vuota),[],{},None,False -
Tutto il resto è truthy.
-
Esempio:
3 — Stringhe (30 min)
Creazione e tipi
-
s = "ciao"os = 'ciao'. Multilinea con triple quote"""...""". -
Stringhe sono immutabili: ogni modifica crea un nuovo oggetto.
Operazioni comuni
-
Concatenazione:
"a" + "b" -
Ripetizione:
"ha" * 3→"hahaha" -
Indicizzazione:
s[0], slicing:s[1:4] -
Metodi utili:
.strip(),.lower(),.upper(),.replace(),.split(),.join() -
F-strings (Python 3.6+):
f"Valore: {x:.2f}"per formattazione leggibile.
Esempio:
Raw strings e encoding
-
Raw string per regex o percorsi:
r"\n"non interpreta il backslash. -
Bytes:
b'abc', conversione con.encode()/.decode().
4 — Conversioni tra tipi e problemi pratici (30 min)
Conversioni esplicite
-
int(x),float(x),str(x),bool(x),complex(x). -
Usare
Decimalper conversioni da stringhe precise:Decimal('0.1').
Esempi:
Conversioni fallibili e gestione eccezioni
Conversioni da input utente possono fallire — usare try/except.
Implicite e coercizioni
-
In espressioni
int + float→intcoerito afloat. -
Attenzione a
==vsis:isverifica identità oggetto (non usare per confronto di valori numerici o stringhe).
Problemi di virgola mobile (ripreso)
-
Per confronti di float usare tolleranze (
math.isclose()).Esempio:
Esempio avanzato: parsing locale per decimali con virgola
Utenti italiani spesso usano la virgola come separatore decimale. Convertire:
5 — Input da tastiera (20 min)
input() (Python 3)
-
Restituisce sempre una
str. -
Necessario convertire al tipo desiderato.
Esempio robusto:
Validazione e UX minima
-
Controllare range, formato, condizioni.
-
Fornire messaggi chiari e possibilità di uscita (
qper quit).
Esempio con decimali e virgola:
6 — Esercizio principale: Calcolatrice semplice (30 min)
Presenteremo tre versioni incrementali:
Versione A — Calcolatrice menu-driven (sicura, senza eval)
-
Operazioni: addizione, sottrazione, moltiplicazione, divisione; input numero per numero; usa
Decimalper precisione.
Note: uso di Decimal evita errori di floating-point e di rappresentazione; +res fornisce il valore normalizzato secondo il contesto.
Versione B — Evaluator sicuro di espressioni (supporta parentesi, operatori)
Non usare eval() su input non fidati. Usare ast per parsing sicuro o la libreria asteval/numexpr. Esempio con ast + operator:
Vantaggi: valutazione di espressioni complesse senza esporre il processo a comandi arbitrari.
Versione C — Calcolatrice REPL estesa con funzioni e test
-
Organizza le funzioni (
add,sub,mul,div,evaluate) e scrive test unitari (pytestounittest). -
Fornire un pacchetto
calc/con__init__.py,core.py,cli.py,tests/test_core.py.
Esempio test (pytest):
7 — Esercizi e problemi proposti (con soluzioni scheletrate)
Esercizio 1 — Tipi e conversioni
Scrivi una funzione to_number(s) che prova a convertire la stringa s in int, poi float, poi Decimal, restituendo il valore convertito o lancia ValueError.
Suggerimento soluzione:
Esercizio 2 — Parità e filtri
Dato un elenco di stringhe che rappresentano numeri con possibile virgola, filtra solo i numeri pari. Usa Decimal per la conversione.
Esercizio 3 — Calcolatrice estesa
Estendi la Versione A per supportare:
-
potenza
^(mappandola a**), -
memoria
M+,MR(memorizzazione), -
history: salva le ultime 10 espressioni e risultati.
8 — Errori comuni e best practices (sintesi)
-
Non usare
==per confrontare conNone: usareis None. -
Non confrontare float con uguaglianza esatta: usare
math.iscloseoDecimal. -
Evitare
eval()su input non controllato: rischio di code injection. -
Gestire eccezioni sempre quando converti l’input.
-
Preferire funzioni pure e testabili per la logica (separa CLI e core).
-
Usare type hints per chiarezza:
def add(a: Decimal, b: Decimal) -> Decimal:e poimypyper controlli statici.
9 — Tipi avanzati (breve cenno, oltre il modulo)
-
list,tuple,set,dict(container). -
typing:Optional,Union,List[int],Dict[str, Any]. -
dataclassesper strutture dati leggere (@dataclass).
10 — Valutazione (rubrica proposta)
-
Comprensione concettuale (30%): nomi, scope, tipi, conversioni.
-
Codifica e correttezza (40%): calcolatrice funzionante, gestione errori, test.
-
Qualità del codice (20%): leggibilità, commenti, adherence a PEP8, uso di funzioni.
-
Estensioni e creatività (10%): extra features (history, memoria, safe eval).
11 — Risorse e letture consigliate
-
Documentazione ufficiale Python — The Python Standard Library (input(), decimal, ast).
-
PEP8 — Style Guide for Python Code.
-
Fluent Python (Luciano Ramalho) — per approfondire tipologie avanzate e idiomi Python.
-
Documentazione
decimalemathmodule per gestione numerica.
12 — Esempio completo (Script finale compatto)
Un singolo script calc_decimal_safe.py che combina menu, Decimal e ast safe-eval:
Conclusione
Questo modulo fornisce le basi indispensabili per lavorare in Python: naming corretto, tipi base, conversioni robuste, input e validazione. La calcolatrice è un esercizio didattico ideale perché obbliga ad affrontare tutti i temi: parsing, validazione, error handling, precisione numerica e sicurezza.

Nessun commento:
Posta un commento