Hai aperto l’editor, hai scritto print("ciao"), ha funzionato… e adesso? Adesso viene la parte che conta davvero: imparare a tenere in mano i dati. Perché tutto il machine learning che faremo insieme — dai dataset alle predizioni — alla fine è fatto di tre cose semplicissime: numeri, testo e sequenze di valori. Se impari a maneggiare bene questi tre mattoni oggi, tra qualche articolo ti sembrerà naturale caricare un dataset con Pandas o addestrare un modello con scikit-learn. Ti do del tu, come sempre in questa serie: siamo in laboratorio insieme.
Tipi, strutture dati, controllo di flusso e funzioni: le basi di Python sono nel libro, in un percorso che si legge in ordine.
Un prerequisito solo: ti serve Python 3.12 installato e un ambiente virtuale attivo. Se non ricordi come si fa, ti basta sapere che python -m venv .venv crea l’ambiente e source .venv/bin/activate lo accende (ne abbiamo parlato nel tutorial sull’ambiente di lavoro). Per oggi non serve nessuna libreria esterna: solo Python puro e il tuo editor, VS Code o PyCharm che sia.
Un modo utile di pensare ai tipi: contenitori
Prima del codice, un’immagine che ti accompagnerà per tutta la serie. Ogni valore in Python vive dentro un contenitore con regole proprie:
- Un numero è una scatolina sigillata con un solo valore dentro:
42, oppure3.14. Piccola, veloce, niente scomparti. - Una stringa è una catena di caselle saldate tra loro: una lettera per casella, in un ordine preciso. Puoi leggerla quanto vuoi, ma non puoi sostituire una casella: la catena è saldata (si dice immutabile).
- Una lista è una cassetta aperta con scomparti: puoi aggiungere, togliere, riordinare. È il contenitore tuttofare.
I tre contenitori di base: il numero custodisce un valore solo, la stringa è una sequenza saldata che non si modifica, la lista è una cassetta aperta in cui entrano ed escono elementi.
Numeri: interi per contare, float per misurare
Python distingue due famiglie di numeri. Gli interi (int) servono per contare: 28 iscritti, 3 tentativi, 0 errori. I float servono per misurare: 49.90 euro, 36.6 gradi. È la differenza tra contare le uova nel cartone e pesare la farina con la bilancia: per le uova non esiste «mezzo uovo», per la farina i decimali sono tutto.
C’è un dettaglio che prima o poi ti morderà, quindi te lo dico subito: i float sono approssimazioni. Il computer li memorizza in binario, e alcuni decimali semplicissimi per noi (come 0.1) in binario sono periodici. Risultato: 0.1 + 0.2 non fa esattamente 0.3. Non è un bug di Python, è la natura dei float — e nel machine learning, dove sommi milioni di float, conviene saperlo dal giorno uno.
Stringhe: il testo è una sequenza (saldata)
Una stringa è testo tra virgolette: "PAIthon". La cosa importante è che Python la tratta come una sequenza ordinata di caratteri: puoi chiedere il primo, l’ultimo, una fetta in mezzo. Ma non puoi modificarla sul posto: come una parola stampata su un biglietto, se vuoi correggerla non cancelli una lettera con la penna — ristampi il biglietto. In Python si dice che le stringhe sono immutabili: ogni «modifica» crea in realtà una stringa nuova.
Le stringhe moderne si formattano con le f-string: scrivi f"Ciao, {nome}!" e Python inserisce il valore della variabile al posto delle graffe. Dimentica % e .format() che trovavi nei tutorial di dieci anni fa: le f-string sono più leggibili e sono lo standard.
Liste: la cassetta degli attrezzi
La lista è il contenitore che userai più spesso: una sequenza ordinata e modificabile di valori, scritti tra parentesi quadre. Pensa al cassetto delle posate: ha scomparti in un certo ordine, puoi aggiungere un mestolo, togliere una forchetta, riordinare tutto. E come nel cassetto puoi mettere oggetti diversi, una lista può contenere numeri, stringhe, perfino altre liste — anche se, lo vedrai, le liste omogenee sono quasi sempre la scelta più sana.
Un dataset, in fondo, è solo una lista di esempi. Chi sa manipolare le liste sa già manipolare i dati: il resto è rifinitura.
Ora mettiamo tutto in pratica. Copia questo script in un file tipi_base.py ed eseguilo con python tipi_base.py: ogni riga commentata ti dice cosa aspettarti.
# tipi_base.py — numeri, stringhe e liste in azione
# Requisiti: Python 3.12, nessuna libreria esterna
# ---------- NUMERI ----------
iscritti = 28 # int: si conta, niente virgola
prezzo = 49.90 # float: si misura, con la virgola
incasso = iscritti * prezzo
print(f"Incasso: {incasso:.2f} euro") # :.2f = due decimali
# I float sono approssimazioni binarie:
print(0.1 + 0.2) # 0.30000000000000004 (!)
print(round(0.1 + 0.2, 2)) # 0.3 — arrotonda quando mostri il risultato
# Le quattro divisioni che devi conoscere:
print(7 / 2) # 3.5 divisione vera (sempre float)
print(7 // 2) # 3 divisione intera (tronca)
print(7 % 2) # 1 resto (utile per pari/dispari)
print(2 ** 10) # 1024 potenza
# ---------- STRINGHE ----------
corso = "PAIthon pratico"
print(len(corso)) # 15 — numero di caratteri
print(corso.upper()) # PAITHON PRATICO
print(corso[0]) # P — il primo carattere (si conta da 0!)
print(corso[-1]) # o — l'ultimo, con l'indice negativo
print(corso[0:7]) # PAIthon — una "fetta" (slicing)
# Le stringhe sono immutabili: questa riga darebbe TypeError
# corso[0] = "p"
# Si crea invece una stringa NUOVA:
titolo = corso.replace("pratico", "in pratica")
print(titolo) # PAIthon in pratica
print(corso) # PAIthon pratico — l'originale è intatto
# split trasforma una frase in lista di parole: lo riuserai ovunque
parole = corso.split(" ")
print(parole) # ['PAIthon', 'pratico']
# ---------- LISTE ----------
voti = [7, 9, 6, 8]
voti.append(10) # aggiunge in coda -> [7, 9, 6, 8, 10]
voti.remove(6) # toglie il PRIMO 6 -> [7, 9, 8, 10]
voti[0] = 5 # le liste SI modificano sul posto
print(voti) # [5, 9, 8, 10]
voti.sort() # ordina la lista stessa (non ne crea una nuova)
print(voti) # [5, 8, 9, 10]
print(voti[0], voti[-1]) # 5 10 — minimo e massimo dopo il sort
# Lo slicing funziona come per le stringhe:
print(voti[1:3]) # [8, 9] — dall'indice 1 al 2 (il 3 è escluso)
# Tre funzioni che usiamo di continuo sui dati:
media = sum(voti) / len(voti)
print(f"Media: {media}, min: {min(voti)}, max: {max(voti)}")
# Una lista può contenere di tutto, anche stringhe:
studenti = ["Anna", "Luca", "Sara"]
studenti.append("Marco")
print(f"{len(studenti)} studenti: {studenti}")
Fermati un attimo sul contrasto centrale dello script: corso[0] = "p" è vietato, voti[0] = 5 è permesso. Stessa sintassi, esito opposto. È la differenza tra catena saldata e cassetta aperta, e ci tornerà utilissima nel prossimo tutorial, quando incontrerai le tuple.
Quando questi strumenti NON bastano
Onestà prima di tutto: le liste sono comode ma non sono fatte per il calcolo numerico pesante. Se devi fare la media di dieci voti, sum(voti) / len(voti) va benissimo; se devi fare operazioni su un milione di numeri, la lista diventa lenta e vorace di memoria, e la risposta giusta si chiama NumPy — le dedicheremo due tutorial interi. Allo stesso modo, se ti serve cercare un elemento per nome («il voto di Anna») la lista ti costringe a scorrere tutto: lì il contenitore giusto è il dizionario, protagonista della prossima puntata. Usare lo strumento sbagliato funziona lo stesso, all’inizio; è solo che paghi il conto dopo.
Prova tu
Esercizio concreto: scrivi uno script spesa.py che parte da una lista di prezzi [3.50, 12.90, 7.20, 1.99, 4.50] e: (1) aggiunge un prezzo a tua scelta con append, (2) stampa il totale arrotondato a due decimali con una f-string, (3) stampa il prezzo più alto e il più basso, (4) crea la stringa "Hai comprato N articoli" senza scrivere N a mano. Bonus: ordina i prezzi dal più caro al più economico (suggerimento: sort accetta reverse=True).
Per approfondire: il capitolo «Un’introduzione informale a Python» del tutorial ufficiale (esiste tradotto in italiano!) copre esattamente questi tipi, con dettagli su slicing e stringhe che qui ho solo sfiorato. Leggerlo dopo questo articolo è il modo migliore per fissare tutto.

I commenti sono riservati agli iscritti.
Accedi per commentare