Introduzione
Un esempio pratico per imparare a usare insieme le librerie standard math, datetime e random consiste nel creare un pianificatore di sessioni di studio. Il programma riceve un elenco di argomenti, assegna a ciascuno una difficoltà e distribuisce il lavoro nei giorni disponibili.
In questo progetto:
- math viene usata per arrotondare il numero di sessioni necessarie;
- datetime gestisce date, durate e scadenze;
- random seleziona casualmente gli argomenti e introduce una piccola variazione realistica nella durata delle sessioni.
L’obiettivo non è creare un sistema professionale di gestione del tempo, ma costruire un esempio concreto e facilmente estendibile. Il codice mostra inoltre alcune buone pratiche: funzioni separate, dati strutturati, validazione degli input e formattazione leggibile dell’output.
Codice completo
import math
import random
from datetime import date, datetime, timedelta
def crea_piano(argomenti, giorni_disponibili, ore_giornaliere):
"""Crea un piano di studio distribuito su più giorni."""
if not argomenti:
raise ValueError("L´elenco degli argomenti non può essere vuoto.")
if giorni_disponibili <= 0:
raise ValueError("I giorni disponibili devono essere positivi.")
if ore_giornaliere <= 0:
raise ValueError("Le ore giornaliere devono essere positive.")
piano = []
data_corrente = date.today()
# Copiamo la lista per non modificare i dati originali.
argomenti_disponibili = argomenti.copy()
random.shuffle(argomenti_disponibili)
# Calcoliamo il numero medio di minuti disponibili ogni giorno.
minuti_giornalieri = ore_giornaliere * 60
for giorno in range(giorni_disponibili):
if not argomenti_disponibili:
break
# Scegliamo un argomento casuale e lo rimuoviamo dalla lista.
argomento = argomenti_disponibili.pop()
# La difficoltà varia da 1 a 5.
difficolta = random.randint(1, 5)
# Un argomento più difficile richiede più tempo.
minuti_stimati = minuti_giornalieri * (0.5 + difficolta / 5)
# math.ceil arrotonda sempre verso l´alto.
sessioni = math.ceil(minuti_stimati / 45)
# Ogni sessione dura circa 45 minuti.
durata_totale = sessioni * 45
# Aggiungiamo una pausa casuale tra 5 e 15 minuti.
pausa = random.randint(5, 15)
piano.append({
"data": data_corrente,
"argomento": argomento,
"difficolta": difficolta,
"sessioni": sessioni,
"durata": durata_totale,
"pausa": pausa
})
data_corrente += timedelta(days=1)
return piano
def mostra_piano(piano):
"""Stampa il piano in un formato leggibile."""
print("nPIANO DI STUDIO")
print("-" * 60)
totale_minuti = 0
for elemento in piano:
data_formattata = elemento["data"].strftime("%d/%m/%Y")
print(f"Data: {data_formattata}")
print(f"Argomento: {elemento[´argomento´]}")
print(f"Difficoltà: {elemento[´difficolta´]}/5")
print(f"Sessioni da 45 minuti: {elemento[´sessioni´]}")
print(f"Tempo di studio: {elemento[´durata´]} minuti")
print(f"Pausa consigliata: {elemento[´pausa´]} minuti")
print("-" * 60)
totale_minuti += elemento["durata"]
ore_totali = totale_minuti / 60
print(f"Tempo totale previsto: {totale_minuti} minuti")
print(f"Equivalente in ore: {ore_totali:.1f}")
def mostra_scadenza(giorni):
"""Mostra la data e l´ora della scadenza del piano."""
scadenza = datetime.now() + timedelta(days=giorni)
testo = scadenza.strftime("%d/%m/%Y alle %H:%M")
print(f"nIl piano termina indicativamente il {testo}.")
# Dati di esempio
argomenti = [
"Variabili e tipi di dato",
"Funzioni",
"Liste e dizionari",
"Programmazione a oggetti",
"Gestione dei file",
"Eccezioni"
]
giorni = 6
ore_al_giorno = 2
piano = crea_piano(argomenti, giorni, ore_al_giorno)
mostra_piano(piano)
mostra_scadenza(giorni) Spiegazione
Importazione delle librerie
Il programma importa le tre librerie standard richieste. math contiene funzioni matematiche aggiuntive, come ceil(). random permette di generare valori casuali e mescolare liste. Da datetime importiamo date, datetime e timedelta.
La classe date rappresenta una data senza orario, mentre datetime rappresenta data e ora. timedelta è utile per eseguire operazioni come “aggiungi tre giorni” o “sottrai due ore”.
Distribuzione delle sessioni
La funzione crea_piano() riceve gli argomenti, il numero di giorni disponibili e le ore di studio quotidiane. Prima controlla che i valori siano validi. Sollevare un ValueError rende esplicito il problema e impedisce al programma di continuare con dati incoerenti.
random.shuffle() modifica casualmente l’ordine di una copia della lista. In questo modo ogni esecuzione può produrre un piano differente, senza alterare la lista originale.
La difficoltà viene generata con random.randint(1, 5). Il valore viene utilizzato per stimare i minuti di studio. Non si tratta di una formula scientifica, ma di un modello semplice per simulare una pianificazione realistica.
La funzione math.ceil() è importante perché il risultato delle divisioni può essere decimale. Se servono 2,2 sessioni, non possiamo organizzare una frazione di sessione: è quindi necessario arrotondare a 3.
Gestione delle date
La variabile data_corrente parte dalla data odierna, ottenuta con date.today(). Alla fine di ogni iterazione viene aggiunto un giorno tramite:
data_corrente += timedelta(days=1) Per visualizzare le date in formato italiano viene usato strftime("%d/%m/%Y"). I codici principali sono %d per il giorno, %m per il mese e %Y per l’anno a quattro cifre.
Risultati strutturati
Ogni giornata viene memorizzata in un dizionario. I dizionari rendono il programma più leggibile rispetto all’uso di molte variabili separate. La lista piano contiene tutti questi dizionari e può essere facilmente salvata in un file, convertita in JSON oppure mostrata in un’interfaccia grafica.
Best practice
- Separa le responsabilità: una funzione crea il piano, un’altra lo visualizza e una terza calcola la scadenza.
- Non modificare inutilmente i dati originali: usare
argomenti.copy()evita effetti collaterali quando la lista viene mescolata. - Valida gli input: giorni e ore devono essere maggiori di zero.
- Usa nomi descrittivi: variabili come
minuti_giornalieriedurata_totalerendono il codice comprensibile. - Formatta solo in fase di output: le date vengono conservate come oggetti
datee trasformate in testo soltanto quando vengono stampate. - Considera la riproducibilità: durante i test puoi usare
random.seed(10)prima delle estrazioni casuali per ottenere sempre gli stessi risultati.
Riepilogo
In questo progetto abbiamo creato un pianificatore di studio basato esclusivamente su librerie standard. math ha permesso di calcolare il numero intero di sessioni necessarie, datetime ha gestito calendario e scadenze, mentre random ha introdotto variabilità nella scelta degli argomenti, nella difficoltà e nelle pause.
Il programma può essere migliorato aggiungendo un input da tastiera, il salvataggio su file CSV, la possibilità di saltare i fine settimana oppure un sistema che assegni più sessioni agli argomenti più difficili.
Approfondisci con risorse ufficiali
- Modulo math: documentazione ufficiale Python per funzioni matematiche e arrotondamenti.
- Modulo datetime: riferimento per date, orari, formattazione e intervalli temporali.
- Modulo random: guida ufficiale per numeri casuali, selezioni e mescolamento di sequenze.
- Documentazione Python: consulta anche le sezioni dedicate alle eccezioni, alle funzioni e alle strutture dati.
