Uso pratico di <strong>math</strong>, <strong>datetime</strong> e <strong>random</strong> pe

by theArchitect
SHARE
Uso pratico di <strong>math</strong>, <strong>datetime</strong> e <strong>random</strong> pe
© Guida-HTML5.it

Introduzione

Le librerie standard di Python sono una risorsa preziosa perché permettono di risolvere problemi comuni senza installare pacchetti esterni. Tra le più utili troviamo math, datetime e random: tre moduli semplici da usare, ma molto potenti quando lavorano insieme.

In questo tutorial vedremo un caso pratico e realistico: analizzare una sessione di allenamento. Immagina di voler registrare alcuni dati di una corsa o di un workout, calcolare metriche utili, stimare una fascia oraria casuale per il prossimo allenamento e produrre un piccolo riepilogo leggibile.

Questo esempio è utile perché unisce tre esigenze tipiche di molti progetti reali:

  • fare calcoli numerici con math;
  • gestire date e orari con datetime;
  • simulare o selezionare valori casuali con random.

Il risultato sarà un programma semplice ma concreto, facilmente adattabile a tracker sportivi, app di benessere o strumenti di reportistica personale.

Codice completo

from math import ceil, sqrt
from datetime import datetime, timedelta
import random

# ----------------------------
# Dati di esempio della sessione
# ----------------------------

# Lista di split: distanza in km e tempo in minuti per ogni tratto
splits = [
    {"km": 1.0, "minuti": 6.2},
    {"km": 1.0, "minuti": 6.0},
    {"km": 1.0, "minuti": 5.8},
    {"km": 1.0, "minuti": 6.4},
    {"km": 1.0, "minuti": 6.1},
]

# Orario di inizio allenamento in formato ISO
inizio_str = "2026-07-04 18:30:00"
inizio_allenamento = datetime.strptime(inizio_str, "%Y-%m-%d %H:%M:%S")

# ----------------------------
# Calcoli principali
# ----------------------------

distanza_totale = sum(split["km"] for split in splits)
tempo_totale_minuti = sum(split["minuti"] for split in splits)

# Velocità media in km/h
tempo_totale_ore = tempo_totale_minuti / 60
velocita_media = distanza_totale / tempo_totale_ore

# Passo medio in minuti per km
passo_medio = tempo_totale_minuti / distanza_totale

# Calcolo di una metrica "di regolarità":
# deviazione semplice rispetto al passo medio
scarti = [abs(split["minuti"] / split["km"] - passo_medio) for split in splits]
regolarita = sum(scarti) / len(scarti)

# Un indice sintetico di fatica (esempio didattico):
# combina distanza e durata con una radice quadrata per ridurre la crescita lineare
indice_fatica = sqrt(distanza_totale * tempo_totale_minuti)

# Tempo di fine allenamento
fine_allenamento = inizio_allenamento + timedelta(minutes=tempo_totale_minuti)

# ----------------------------
# Simulazione del prossimo allenamento
# ----------------------------

# Scegliamo casualmente un giorno della settimana e una fascia oraria
giorni_possibili = ["Lunedì", "Mercoledì", "Venerdì", "Sabato"]
fasce_orarie = ["07:00", "12:30", "18:15", "20:00"]

giorno_prossimo = random.choice(giorni_possibili)
ora_prossima = random.choice(fasce_orarie)

# Stimiamo una durata casuale leggermente variabile rispetto alla sessione attuale
variazione = random.randint(-10, 15)  # minuti
durata_prossima = max(20, int(round(tempo_totale_minuti + variazione)))

# ----------------------------
# Report finale
# ----------------------------

print("=== REPORT SESSIONE DI ALLENAMENTO ===")
print(f"Inizio allenamento: {inizio_allenamento:%d/%m/%Y %H:%M}")
print(f"Fine allenamento:   {fine_allenamento:%d/%m/%Y %H:%M}")
print(f"Distanza totale:    {distanza_totale:.1f} km")
print(f"Tempo totale:       {tempo_totale_minuti:.1f} minuti")
print(f"Velocità media:     {velocita_media:.2f} km/h")
print(f"Passo medio:        {passo_medio:.2f} min/km")
print(f"Regolarità media:   {regolarita:.2f} min/km")
print(f"Indice fatica:      {indice_fatica:.2f}")

print("n=== PROSSIMO ALLENAMENTO SUGGERITO ===")
print(f"Giorno: {giorno_prossimo}")
print(f"Orario: {ora_prossima}")
print(f"Durata stimata: {durata_prossima} minuti")

# ----------------------------
# Esempio di utilizzo extra di math:
# arrotondamento verso l´alto di una distanza obiettivo
# ----------------------------

obiettivo_km = 7.3
ripetizioni_da_1km = ceil(obiettivo_km)
print("n=== OBIETTIVO ===")
print(f"Per coprire almeno {obiettivo_km} km, servono {ripetizioni_da_1km} ripetizioni da 1 km.")

Spiegazione

Vediamo ora il codice in modo ordinato, così da capire bene il ruolo di ogni libreria.

1. Import delle librerie

All’inizio importiamo:

  • sqrt e ceil da math, per fare operazioni matematiche;
  • datetime e timedelta da datetime, per gestire date e durate;
  • random, per selezionare elementi casuali e generare variazioni.

2. Dati della sessione

La variabile splits contiene una lista di dizionari. Ogni dizionario rappresenta un tratto di corsa con distanza e tempo. Questo formato è molto leggibile e facile da estendere: puoi aggiungere battito cardiaco, ritmo, calorie o note personali.

3. Calcoli con math

Con sum() otteniamo distanza e tempo totali. Poi calcoliamo:

  • velocità media: distanza totale divisa per il tempo in ore;
  • passo medio: minuti per chilometro;
  • regolarità: quanto ogni split si discosta dal passo medio;
  • indice di fatica: una metrica sintetica costruita con sqrt().

La radice quadrata è utile quando vuoi creare un valore che cresca in modo meno aggressivo rispetto a una semplice moltiplicazione. In questo esempio non rappresenta una formula sportiva ufficiale, ma un indicatore didattico facilmente comprensibile.

4. Gestione del tempo con datetime

La stringa dell’orario di inizio viene convertita in oggetto data/ora con datetime.strptime(). Questo permette di lavorare con date reali invece di semplici stringhe.

Per calcolare l’orario di fine usiamo timedelta(minutes=tempo_totale_minuti), che aggiunge la durata dell’allenamento all’orario iniziale. È una delle operazioni più comuni quando si lavora con calendari, prenotazioni o attività pianificate.

5. Simulazione con random

La libreria random serve a introdurre variabilità. In questo caso:

  • random.choice() seleziona un giorno e una fascia oraria tra quelli disponibili;
  • random.randint() genera una variazione casuale della durata del prossimo allenamento.

Questo approccio è utile quando vuoi proporre suggerimenti dinamici, creare scenari di test o simulare dati realistici.

6. Output finale

Il programma stampa un report leggibile con tutti i valori principali. In un progetto reale potresti:

  • scrivere il report in un file;
  • inviarlo via email;
  • salvarlo in un database;
  • trasformarlo in JSON per un’app web.

Best practice

  • Usa strutture dati chiare: una lista di dizionari è spesso più leggibile di una lista di tuple quando i campi hanno un significato preciso.
  • Separa i dati dalla logica: nei progetti più grandi conviene distinguere input, calcoli e output.
  • Controlla i valori minimi: nel codice abbiamo usato max(20, ...) per evitare una durata troppo bassa del prossimo allenamento.
  • Preferisci datetime a stringhe manuali: appena devi fare operazioni temporali, converti subito le date in oggetti datetime.
  • Usa random con criterio: per test o simulazioni va benissimo, ma se ti serve ripetibilità puoi impostare un seed con random.seed().
  • Commenta le metriche non ovvie: se crei un indice personalizzato, spiega sempre come funziona e a cosa serve.

Riepilogo

In questo tutorial abbiamo visto come math, datetime e random possano collaborare in un piccolo progetto concreto: l’analisi di una sessione di allenamento.

Abbiamo imparato a:

  • calcolare distanza, tempo, velocità media e passo medio;
  • gestire date e orari in modo corretto con datetime;
  • generare suggerimenti casuali con random;
  • costruire un report utile e leggibile.

Questo tipo di esercizio è molto utile per allenarsi con le librerie standard di Python e per sviluppare un approccio pratico alla programmazione. Una volta compresi questi concetti, potrai applicarli a molti altri contesti: monitoraggio delle abitudini, gestione eventi, analisi di log o simulazioni di dati.

Approfondisci con risorse ufficiali

  • math: documentazione ufficiale Python — funzioni matematiche di base e avanzate
  • datetime: documentazione ufficiale Python — gestione di date, orari e intervalli
  • random: documentazione ufficiale Python — generazione di numeri casuali e selezione di elementi

Puoi trovare la documentazione completa sul sito ufficiale di Python. Consultarla è sempre una buona abitudine, perché le librerie standard sono ben documentate e aggiornate con esempi affidabili.

SHARE