Esercitazioni Python: esercizi e soluzioni per studio o lavoro

Foto dell'autore

Andrea Barbieri

 

Home > News feed > Lavorare nel settore > Esercitazioni Python: esercizi e soluzioni per studio o lavoro

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:

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()

Lascia un commento