Questo percorso di esercizi e soluzioni è stato strutturato per guidarti, passo dopo passo, nel diventare un abile sviluppatore Python, capace non solo di scrivere codice, ma di creare soluzioni informatiche complete, testate e affidabili. Python si distingue per la sua semplicità e potenza, permettendo ai novizi di avvicinarsi al mondo della programmazione con fiducia e agli esperti di sviluppare soluzioni complesse con relativa facilità.
Prima di procedere con gli esercizi, consigliamo alcune guide di approfondimento:
- Introduzione a Python
- Guida agli Script in Python
- Espressioni regolari con Python
- Creare un’interfaccia grafico in Python
- Librerie grafiche Python
- Tutorial Python API
Indice dei contenuti
Esercitazione sui fondamentali Python
- Variabili e tipi di dati
- Operatori
- Strutture di controllo del flusso (if, else, while, for)
Esercizio
Scrivi un programma in Python che esegua questi compiti:
- Chiede all’utente di inserire un numero.
- Stampa se il numero è pari o dispari.
- Stampa “Il numero è maggiore di 10” se il numero inserito è superiore a 10, altrimenti “Il numero è 10 o inferiore”.
Soluzione
La soluzione sarà fornita a seguito dell’esercitazione.
# Acquisizione input dall'utente numero = int(input("Inserisci un numero: ")) # Verifica se il numero è pari o dispari if numero % 2 == 0: print("Il numero è pari.") else: print("Il numero è dispari.") # Verifica se il numero è maggiore di 10 if numero > 10: print("Il numero è maggiore di 10.") else: print("Il numero è 10 o inferiore.")
Esercitazione Python su funzioni e moduli
- Definizione di funzioni
- Parametri e argomenti
- Funzioni ricorsive
- Importazione di moduli e librerie
Esercizio
Crea una funzione chiamata “factorial” che calcola il fattoriale di un numero utilizzando la ricorsività. Inoltre, importa il modulo math per confrontare il risultato della tua funzione con la funzione factorial fornita dal modulo math. Alla fine, stampa il risultato di entrambi i metodi per il numero 5.
Soluzione
def factorial(n): if n == 0: return 1 else: return n * factorial(n-1) import math # Calcolo del fattoriale utilizzando la funzione personalizzata mio_fattoriale = factorial(5) print(f"Fattoriale calcolato con funzione personalizzata: {mio_fattoriale}") # Calcolo del fattoriale utilizzando la funzione del modulo math fattoriale_math = math.factorial(5) print(f"Fattoriale calcolato con funzione del modulo math: {fattoriale_math}")
Esercizio Python su strutture dati
- Liste
- Tuple
- Dizionari
- Set
Esercizio
Data una lista di numeri: [10, 20, 30, 40, 50, 60, 10, 20, 30], crea un dizionario che contenga ogni numero come chiave e il numero di volte che appare nella lista come valore. Successivamente, converti la lista in un set per rimuovere i duplicati e infine convertilo in una tuple.
Soluzione
# Data lista di numeri numeri = [10, 20, 30, 40, 50, 60, 10, 20, 30] # Creazione del dizionario con conteggio delle occorrenze dizionario = {} for num in numeri: if num in dizionario: dizionario[num] += 1 else: dizionario[num] = 1 print("Dizionario delle occorrenze:", dizionario) # Conversione della lista in set e successiva conversione in tuple insieme = set(numeri) tupla = tuple(insieme) print("Set senza duplicati:", insieme) print("Tuple:", tupla)
Esercitazione base su orientamento agli oggetti
- Classi e oggetti
- Ereditarietà
- Polimorfismo
- Encapsulation
Esercizio
Creare una classe base chiamata “Veicolo” che ha due proprietà: marca e anno. Implementare un metodo chiamato “display_info” che stampa le informazioni del veicolo. Deriva dalla classe Veicolo una nuova classe chiamata “Auto” che ha una proprietà addizionale chiamata “numero_portiere”. Sovrascrivi il metodo “display_info” in modo che stampi anche il numero di portiere. Implementare l’encapsulation proteggendo la proprietà “numero_portiere” e fornendo metodi getter e setter appropriati.
Soluzione
# Classe base Veicolo class Veicolo: def __init__(self, marca, anno): self._marca = marca self._anno = anno def display_info(self): return f"Marca: {self._marca}, Anno: {self._anno}" # Classe derivata Auto class Auto(Veicolo): def __init__(self, marca, anno, numero_portiere): super().__init__(marca, anno) self.__numero_portiere = numero_portiere @property def numero_portiere(self): return self.__numero_portiere @numero_portiere.setter def numero_portiere(self, value): if value > 0: self.__numero_portiere = value else: raise ValueError("Il numero di portiere deve essere positivo.") def display_info(self): info_base = super().display_info() return f"{info_base}, Numero di portiere: {self.__numero_portiere}" # Test del codice auto = Auto("Fiat", 2020, 4) print(auto.display_info())
File e gestione delle eccezioni: esercizio Python
- Lettura e scrittura di file
- Gestione delle eccezioni
Esercizio
Scrivere un programma che legga un file di testo chiamato “input.txt” e raddoppi ogni riga del file scrivendola in un nuovo file chiamato “output.txt”. Durante la lettura e scrittura, gestire le potenziali eccezioni che potrebbero verificarsi, come FileNotFoundError o PermissionError, e stampare un messaggio appropriato all’utente.
Soluzione
try: with open('input.txt', 'r') as infile, open('output.txt', 'w') as outfile: for line in infile: outfile.write(line * 2) except FileNotFoundError: print("Il file 'input.txt' non è stato trovato.") except PermissionError: print("Permesso negato durante l'apertura o la scrittura del file.") except Exception as e: print(f"Si è verificato un errore: {str(e)}")
Esercitazione su interazione con database
- Database relazionali
- ORM (Object-Relational Mapping) con SQLAlchemy
Esercizio
Creare un’applicazione Python che utilizzi SQLAlchemy come ORM. La tua applicazione dovrebbe:
- Connettersi a un database relazionale SQLite.
- Creare una tabella “users” con campi “id“, “name” e “email“.
- Inserire, recuperare e modificare i dati nella tabella “users“.
Soluzione
from sqlalchemy import create_engine, Column, Integer, String, Sequence from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, Sequence('user_id_seq'), primary_key=True) name = Column(String(50)) email = Column(String(100)) engine = create_engine('sqlite:///users.db') Base.metadata.create_all(engine) Session = sessionmaker(bind=engine) session = Session() # Inserire un nuovo utente new_user = User(name='Mario Rossi', email='mario.rossi@example.com') session.add(new_user) session.commit() # Recuperare un utente user = session.query(User).filter_by(name='Mario Rossi').first() print(user.email) # Modificare un utente user.email = 'mario.rossi-updated@example.com' session.commit()
Esercitazione su integrazione e testing
- Unit testing con unittest
- Mocking e patching
Esercizio
Si ha una semplice funzione che si connette a un’API remota per recuperare la temperatura corrente di una città data. La funzione si chiama get_temperature(city) e restituisce la temperatura in gradi Celsius.
Scrivi un test unitario per questa funzione usando unittest. Utilizza il mocking per simulare la risposta dell’API e assicurarti che il tuo test non dipenda da servizi esterni.
Soluzione
import unittest from unittest.mock import patch, Mock # Simulazione della funzione originale def get_temperature(city): # ... Qui ci sarebbe il codice per connettersi all'API ... pass class TestTemperatureAPI(unittest.TestCase): @patch('path_to_module.get_temperature') def test_get_temperature(self, mock_get_temperature): mock_temperature = 20 # Supponiamo che l'API restituisca 20°C per la città data mock_get_temperature.return_value = mock_temperature # Simuliamo una chiamata alla funzione result = get_temperature('Rome') # Verifichiamo che il mock sia stato chiamato mock_get_temperature.assert_called_with('Rome') # Verifica che il risultato sia quello aspettato self.assertEqual(result, mock_temperature) if __name__ == '__main__': unittest.main()
Esercitazione Python di Data Visualization
L’esercizio proposto è volto alla creazione di un grafico a barre che visualizza la distribuzione delle vendite settimanali di un’azienda di e-commerce. I dati forniti rappresentano il numero di vendite per ogni giorno della settimana. La soluzione finale, che puoi visualizzare nell’immagine generata, mostra chiaramente come le vendite fluttuano nel corso della settimana, con picchi durante i fine settimana. Questo tipo di visualizzazione aiuta l’azienda a comprendere meglio i pattern delle vendite e a pianificare strategie di marketing e gestione delle scorte più efficaci.
import matplotlib.pyplot as plt import numpy as np # Esercizio: Visualizzazione di una distribuzione di frequenza # Scenario: # Un'azienda di e-commerce vuole visualizzare la distribuzione delle vendite dei loro prodotti durante la settimana. # I dati sono stati raccolti in un array che rappresenta il numero di vendite per ogni giorno della settimana. # Dati: vendite_settimanali = np.array([350, 224, 198, 237, 299, 450, 488]) # Giorni della settimana giorni = ["Lun", "Mar", "Mer", "Gio", "Ven", "Sab", "Dom"] # Compito: # Creare un grafico a barre per visualizzare il numero di vendite per ogni giorno della settimana. # Soluzione: plt.figure(figsize=(10, 6)) plt.bar(giorni, vendite_settimanali, color='skyblue') plt.title('Vendite settimanali - Distribuzione per giorno') plt.xlabel('Giorno della settimana') plt.ylabel('Numero di vendite') plt.show()