Gestisci prenotazioni, stanze e clienti con strutture dati avanzate.
Introduzione
Benvenuto in questa esercitazione pratica sui dizionari Python! Costruiremo un sistema di prenotazione hotel completo che utilizza dizionari annidati, funzioni e logica intelligente per gestire stanze, clienti e prenotazioni.
Scenario Reale: Lavorerai come sviluppatore per una catena hotel che ha bisogno di un sistema di prenotazione automatizzato. Userai dizionari per memorizzare dati complessi e funzioni per gestire le operazioni.
ATTENZIONE: COPIA BLOCCATA
Il codice Γ¨ protetto da sistema anti-copia. Dovrai SCRIVERE manualmente tutto il codice per imparare veramente! π«π
Parte 1: Creazione Struttura Dati Hotel
Dizionario delle Stanze
1 Crea una nuova cella su Google Colab e definisci le stanze:
PYTHON
# CREAZIONE DIZIONARIO STANZE HOTEL
stanze_hotel = {
101: {"tipo": "Singola", "prezzo": 80, "disponibile": True, "servizi": ["TV", "WiFi"]},
102: {"tipo": "Singola", "prezzo": 80, "disponibile": True, "servizi": ["TV", "WiFi"]},
103: {"tipo": "Doppia", "prezzo": 120, "disponibile": True, "servizi": ["TV", "WiFi", "Minibar"]},
104: {"tipo": "Doppia", "prezzo": 120, "disponibile": False, "servizi": ["TV", "WiFi", "Minibar"]},
201: {"tipo": "Suite", "prezzo": 200, "disponibile": True, "servizi": ["TV", "WiFi", "Minibar", "Jacuzzi"]},
202: {"tipo": "Suite", "prezzo": 200, "disponibile": True, "servizi": ["TV", "WiFi", "Minibar", "Jacuzzi"]},
203: {"tipo": "Familiare", "prezzo": 180, "disponibile": True, "servizi": ["TV", "WiFi", "2 Letti Extra"]},
204: {"tipo": "Familiare", "prezzo": 180, "disponibile": False, "servizi": ["TV", "WiFi", "2 Letti Extra"]}
}
print("π¨ CATALOGO STANZE HOTEL")
print("="*50)
for numero, info in stanze_hotel.items():
stato = "β
DISPONIBILE" if info["disponibile"] else "β OCCUPATA"
print(f"Stanza {numero}: {info['tipo']} - β¬{info['prezzo']}/notte - {stato}")
print(f" Servizi: {', '.join(info['servizi'])}")
print()
Dizionario Clienti e Prenotazioni
2 Crea le strutture per clienti e prenotazioni:
PYTHON
# 2. DIZIONARI PER CLIENTI E PRENOTAZIONI
clienti = {
1001: {"nome": "Mario Rossi", "email": "mario@email.com", "telefono": "3331234567"},
1002: {"nome": "Laura Bianchi", "email": "laura@email.com", "telefono": "3347654321"},
1003: {"nome": "Giuseppe Verdi", "email": "giuseppe@email.com", "telefono": "3359876543"}
}
prenotazioni = {
5001: {"id_cliente": 1001, "stanza": 101, "notti": 3, "totale": 240},
5002: {"id_cliente": 1002, "stanza": 103, "notti": 5, "totale": 600},
5003: {"id_cliente": 1003, "stanza": 201, "notti": 2, "totale": 400}
}
print("\nπ REGISTRO CLIENTI")
print("="*50)
for id_cliente, info in clienti.items():
print(f"ID: {id_cliente} - Nome: {info['nome']}")
print(f" Email: {info['email']} - Tel: {info['telefono']}")
print()
Parte 2: Funzioni per Gestione Intelligente
Funzione per Cercare Stanze Disponibili
3 Crea funzioni per gestire l'hotel:
PYTHON
# 3. FUNZIONI PER GESTIONE HOTEL
def cerca_stanze_disponibili(tipo=None, prezzo_max=None):
"""
Cerca stanze disponibili con filtri opzionali
"""
print(f"\nπ CERCA STANZE DISPONIBILI" + "="*40)
stanze_trovate = []
for numero, info in stanze_hotel.items():
if info["disponibile"]:
# Applica filtri se specificati
if tipo and info["tipo"] != tipo:
continue
if prezzo_max and info["prezzo"] > prezzo_max:
continue
stanze_trovate.append((numero, info))
if stanze_trovate:
for numero, info in stanze_trovate:
print(f"Stanza {numero}: {info['tipo']} - β¬{info['prezzo']}/notte")
print(f" Servizi: {', '.join(info['servizi'])}")
print(f"\nπ Trovate {len(stanze_trovate)} stanze disponibili")
else:
print("β Nessuna stanza disponibile con i filtri selezionati")
return stanze_trovate
# Test della funzione
print("Test 1 - Tutte le stanze disponibili:")
cerca_stanze_disponibili()
print("\nTest 2 - Solo Suite disponibili:")
cerca_stanze_disponibili(tipo="Suite")
print("\nTest 3 - Stanze sotto β¬150:")
cerca_stanze_disponibili(prezzo_max=150)
Parte 3: Sistema di Prenotazione
Funzione per Prenotare una Stanza
4 Crea la funzione di prenotazione:
PYTHON
# 4. FUNZIONE PER PRENOTARE STANZA
def prenota_stanza(id_cliente, numero_stanza, notti):
"""
Prenota una stanza per un cliente
"""
print(f"\nπ
NUOVA PRENOTAZIONE" + "="*45)
# Controlla se il cliente esiste
if id_cliente not in clienti:
print(f"β Cliente ID {id_cliente} non trovato!")
return False
# Controlla se la stanza esiste ed Γ¨ disponibile
if numero_stanza not in stanze_hotel:
print(f"β Stanza {numero_stanza} non esiste!")
return False
if not stanze_hotel[numero_stanza]["disponibile"]:
print(f"β Stanza {numero_stanza} non disponibile!")
return False
# Calcola totale
prezzo_notte = stanze_hotel[numero_stanza]["prezzo"]
totale = prezzo_notte * notti
# Crea nuova prenotazione
nuova_prenotazione_id = max(prenotazioni.keys()) + 1 if prenotazioni else 5001
prenotazioni[nuova_prenotazione_id] = {
"id_cliente": id_cliente,
"stanza": numero_stanza,
"notti": notti,
"totale": totale
}
# Aggiorna stato stanza
stanze_hotel[numero_stanza]["disponibile"] = False
# Mostra conferma
cliente = clienti[id_cliente]
stanza = stanze_hotel[numero_stanza]
print(f"β
PRENOTAZIONE CONFERMATA!")
print(f" ID Prenotazione: {nuova_prenotazione_id}")
print(f" Cliente: {cliente['nome']}")
print(f" Stanza: {numero_stanza} ({stanza['tipo']})")
print(f" Notti: {notti}")
print(f" Prezzo per notte: β¬{prezzo_notte}")
print(f" TOTALE: β¬{totale}")
print(f" Servizi inclusi: {', '.join(stanza['servizi'])}")
return nuova_prenotazione_id
# Test della funzione
print("Test prenotazione - Nuovo cliente nella stanza 203:")
id_nuovo_cliente = 1004
clienti[id_nuovo_cliente] = {"nome": "Anna Neri", "email": "anna@email.com", "telefono": "3361239876"}
prenota_stanza(id_nuovo_cliente, 203, 4)
Funzione per Visualizzare Prenotazioni
5 Crea funzione per report prenotazioni:
PYTHON
# 5. FUNZIONE PER VISUALIZZARE PRENOTAZIONI
def visualizza_prenotazioni(filtro_cliente=None):
"""
Visualizza tutte le prenotazioni o solo quelle di un cliente
"""
print(f"\nπ ELENCO PRENOTAZIONI" + "="*45)
totale_incassi = 0
prenotazioni_trovate = 0
for id_pren, info in prenotazioni.items():
if filtro_cliente and info["id_cliente"] != filtro_cliente:
continue
cliente = clienti[info["id_cliente"]]
stanza = stanze_hotel[info["stanza"]]
print(f"\nPrenotazione #{id_pren}:")
print(f" Cliente: {cliente['nome']} (ID: {info['id_cliente']})")
print(f" Stanza: {info['stanza']} ({stanza['tipo']})")
print(f" Notti: {info['notti']} - Totale: β¬{info['totale']}")
totale_incassi += info["totale"]
prenotazioni_trovate += 1
if prenotazioni_trovate > 0:
print(f"\nπ RIEPILOGO:")
print(f" Prenotazioni trovate: {prenotazioni_trovate}")
print(f" Totale incassi: β¬{totale_incassi}")
else:
print("β Nessuna prenotazione trovata")
# Test delle funzioni
print("\nVisualizza tutte le prenotazioni:")
visualizza_prenotazioni()
print("\nVisualizza prenotazioni del cliente 1001:")
visualizza_prenotazioni(filtro_cliente=1001)
Parte 4: Funzioni Avanzate e Interfaccia
Funzione per Check-out e Statistiche
6 Crea funzioni avanzate per gestione completa:
PYTHON
# 6. FUNZIONI AVANZATE PER GESTIONE HOTEL
def effettua_checkout(numero_stanza):
"""
Libera una stanza dopo il checkout
"""
if numero_stanza in stanze_hotel:
if not stanze_hotel[numero_stanza]["disponibile"]:
stanze_hotel[numero_stanza]["disponibile"] = True
print(f"β
Stanza {numero_stanza} liberata dopo checkout")
return True
else:
print(f"β οΈ Stanza {numero_stanza} giΓ disponibile")
return False
else:
print(f"β Stanza {numero_stanza} non trovata")
return False
def statistiche_hotel():
"""
Mostra statistiche complete dell'hotel
"""
print(f"\nπ STATISTICHE HOTEL" + "="*45)
# Calcola statistiche
totale_stanze = len(stanze_hotel)
stanze_disponibili = sum(1 for info in stanze_hotel.values() if info["disponibile"])
stanze_occupate = totale_stanze - stanze_disponibili
incasso_totale = sum(info["totale"] for info in prenotazioni.values())
notti_totali = sum(info["notti"] for info in prenotazioni.values())
# Calcola occupazione per tipo stanza
occupazione_per_tipo = {}
for info in stanze_hotel.values():
tipo = info["tipo"]
if tipo not in occupazione_per_tipo:
occupazione_per_tipo[tipo] = {"totali": 0, "occupate": 0}
occupazione_per_tipo[tipo]["totali"] += 1
if not info["disponibile"]:
occupazione_per_tipo[tipo]["occupate"] += 1
# Mostra risultati
print(f"Stanze totali: {totale_stanze}")
print(f"Stanze disponibili: {stanze_disponibili} ({stanze_disponibili/totale_stanze*100:.1f}%)")
print(f"Stanze occupate: {stanze_occupate} ({stanze_occupate/totale_stanze*100:.1f}%)")
print(f"Prenotazioni attive: {len(prenotazioni)}")
print(f"Notti prenotate totali: {notti_totali}")
print(f"Incasso totale: β¬{incasso_totale}")
print(f"\nπ OCCUPAZIONE PER TIPO STANZA:")
for tipo, stats in occupazione_per_tipo.items():
perc_occupazione = (stats["occupate"] / stats["totali"] * 100) if stats["totali"] > 0 else 0
print(f" {tipo}: {stats['occupate']}/{stats['totali']} ({perc_occupazione:.1f}%)")
# Test delle funzioni avanzate
print("Test checkout stanza 104:")
effettua_checkout(104)
print("\nStatistiche complete hotel:")
statistiche_hotel()
Concetti di Python e Dizionari Appresi
Congratulazioni! Ora conosci:
- β Dizionari Annidati: Strutture dati complesse e organizzate
- β Funzioni Python: Creazione e utilizzo di funzioni personalizzate
- β Manipolazione Dati: Accesso e modifica di dati in dizionari complessi
- β Sistemi di Filtro: Ricerca e filtraggio di dati con criteri multipli
- β Validazione Dati: Controllo di validitΓ e consistenza dei dati
- β Calcoli Automatici: Calcolo di totali, statistiche e metriche
- β Sistemi Reali: Applicazione di Python a scenari business reali
Prossimi Passi nella Programmazione
Nella prossima esercitazione imparerai:
- π Analisi dati avanzata con Pandas
- ποΈ Sistemi di database con SQLite
- π€ Machine Learning per raccomandazioni
- π API REST per sistemi distribuiti
- π Dashboard interattive con Streamlit
Hai costruito un sistema professionale di gestione hotel con Python!