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 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}")
Esercitazione 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 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())
Esercitazione su File e gestione delle eccezioni
- 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()