Salta ai contenuti
Manuale LogoManuale Logo

Esercizi Python

Inviare in output il testo Ciao, Python!.

Soluzione spiegata

Serve una sola chiamata a print() per mostrare il testo sullo schermo.

print("Ciao, Python!")

Il programma esegue una sola istruzione e stampa esattamente la frase richiesta.

Conservare un nome e un’età in due variabili e inviarli in output.

Soluzione spiegata

Prima salviamo i valori in due variabili, poi li stampiamo.

nome = "Luca"
eta = 17
print(nome)
print(eta)

Le variabili permettono di riutilizzare i dati senza riscriverli ogni volta.

Calcolare la somma di due numeri interi salvati in variabili.

Soluzione spiegata

Salviamo i due numeri e usiamo l’operatore + per ottenere il totale.

a = 12
b = 8
somma = a + b
print(somma)

Il risultato della somma viene memorizzato in una terza variabile e poi stampato.

Calcolare l’area di un rettangolo dati base e altezza.

Soluzione spiegata

L’area del rettangolo si ottiene moltiplicando base per altezza.

base = 5
altezza = 3
area = base * altezza
print(area)

La variabile area contiene il valore finale del calcolo.

Scambiare il valore di due variabili e inviarle in output.

Soluzione spiegata

In Python possiamo scambiare due valori in una sola riga.

x = 10
y = 20
x, y = y, x
print(x)
print(y)

Dopo lo scambio, x contiene il vecchio valore di y e viceversa.

Leggere un nome da input e stampare un saluto.

Soluzione spiegata

Usiamo input() per leggere il testo e print() per costruire il messaggio.

nome = input("Inserisci il tuo nome: ")
print("Ciao,", nome)

Il valore digitato dall’utente viene salvato nella variabile nome.

Leggere due numeri interi e stamparne la somma.

Soluzione spiegata

input() restituisce testo, quindi convertiamo i valori con int().

a = int(input("Primo numero: "))
b = int(input("Secondo numero: "))
print(a + b)

Senza la conversione, Python tratterebbe i dati come stringhe.

Leggere un prezzo e una quantità e calcolare il totale.

Soluzione spiegata

Per il prezzo usiamo float(), mentre la quantità può essere intera.

prezzo = float(input("Prezzo: "))
quantita = int(input("Quantita: "))
totale = prezzo * quantita
print(totale)

Il programma moltiplica il costo di una singola unità per il numero di pezzi.

Convertire una temperatura da gradi Celsius a gradi Fahrenheit.

Soluzione spiegata

La formula è fahrenheit = celsius * 9 / 5 + 32.

celsius = float(input("Gradi Celsius: "))
fahrenheit = celsius * 9 / 5 + 32
print(fahrenheit)

Il risultato finale viene stampato come numero decimale.

Calcolare la media di tre numeri.

Soluzione spiegata

Sommiamo i tre valori e dividiamo per 3.

a = float(input("Primo numero: "))
b = float(input("Secondo numero: "))
c = float(input("Terzo numero: "))
media = (a + b + c) / 3
print(media)

La formula della media aritmetica è diretta e usa un solo passaggio.

Verificare se un numero intero è pari o dispari.

Soluzione spiegata

Usiamo l’operatore % per controllare il resto della divisione per 2.

numero = int(input("Inserisci un numero: "))
if numero % 2 == 0:
print("Pari")
else:
print("Dispari")

Se il resto è zero, il numero è pari; altrimenti è dispari.

Determinare se un numero è positivo, negativo oppure zero.

Soluzione spiegata

Con if, elif ed else gestiamo i tre casi possibili.

numero = int(input("Inserisci un numero: "))
if numero > 0:
print("Positivo")
elif numero < 0:
print("Negativo")
else:
print("Zero")

Le condizioni vengono controllate dall’alto verso il basso.

Determinare il maggiore tra due numeri.

Soluzione spiegata

Confrontiamo i due valori e stampiamo quello più grande.

a = int(input("Primo numero: "))
b = int(input("Secondo numero: "))
if a > b:
print(a)
else:
print(b)

Se i due numeri sono uguali, il programma stampa comunque il secondo valore, che ha lo stesso contenuto.

Determinare il maggiore tra tre numeri.

Soluzione spiegata

Partiamo dal primo numero come massimo provvisorio e poi aggiorniamo il valore.

a = int(input("Primo numero: "))
b = int(input("Secondo numero: "))
c = int(input("Terzo numero: "))
massimo = a
if b > massimo:
massimo = b
if c > massimo:
massimo = c
print(massimo)

La variabile massimo conserva il valore più grande trovato fino a quel momento.

Verificare se una persona è maggiorenne.

Soluzione spiegata

Basta controllare se l’età è almeno 18.

eta = int(input("Eta: "))
if eta >= 18:
print("Maggiorenne")
else:
print("Minorenne")

La soglia dei 18 anni divide i due casi richiesti.

Classificare un voto numerico come ottimo, buono, sufficiente o insufficiente.

Soluzione spiegata

Le condizioni vanno ordinate dalla soglia più alta a quella più bassa.

voto = int(input("Voto: "))
if voto >= 9:
print("Ottimo")
elif voto >= 7:
print("Buono")
elif voto >= 6:
print("Sufficiente")
else:
print("Insufficiente")

Python si ferma alla prima condizione vera.

Verificare se un anno è bisestile.

Soluzione spiegata

Un anno è bisestile se è divisibile per 400, oppure se è divisibile per 4 ma non per 100.

anno = int(input("Anno: "))
if anno % 400 == 0 or (anno % 4 == 0 and anno % 100 != 0):
print("Bisestile")
else:
print("Non bisestile")

La condizione combina and e or per rispettare la regola completa.

Verificare se due numeri hanno lo stesso segno.

Soluzione spiegata

Due numeri hanno lo stesso segno se sono entrambi positivi oppure entrambi negativi.

a = int(input("Primo numero: "))
b = int(input("Secondo numero: "))
if (a >= 0 and b >= 0) or (a < 0 and b < 0):
print("Stesso segno")
else:
print("Segno diverso")

La condizione separa chiaramente i due casi utili.

Applicare uno sconto del 10% se una spesa supera 100.

Soluzione spiegata

Calcoliamo il totale e, solo se necessario, applichiamo la riduzione.

totale = float(input("Totale spesa: "))
if totale > 100:
totale = totale * 0.9
print(totale)

La variabile totale viene aggiornata solo nel caso richiesto.

Verificare se una parola è presente in una lista di parole.

Soluzione spiegata

L’operatore in serve proprio a controllare la presenza di un elemento.

parole = ["casa", "scuola", "mare", "montagna"]
scelta = input("Parola da cercare: ")
if scelta in parole:
print("Presente")
else:
print("Assente")

Il programma confronta la parola letta con tutti gli elementi della lista.

Stampare i numeri da 1 a 10 usando while.

Soluzione spiegata

Serve una variabile contatore da aggiornare a ogni iterazione.

numero = 1
while numero <= 10:
print(numero)
numero += 1

Il ciclo continua finché la condizione numero <= 10 resta vera.

Calcolare la somma dei numeri da 1 a n usando while.

Soluzione spiegata

Accumuliamo i valori in una variabile totale.

n = int(input("n: "))
totale = 0
numero = 1
while numero <= n:
totale += numero
numero += 1
print(totale)

Ogni passaggio aggiunge il numero corrente alla somma complessiva.

Stampare un conto alla rovescia da n fino a 0.

Soluzione spiegata

In questo caso il contatore viene diminuito a ogni giro.

n = int(input("Numero iniziale: "))
while n >= 0:
print(n)
n -= 1

Il ciclo termina quando il valore scende sotto zero.

Stampare la tabellina del 7.

Soluzione spiegata

Usiamo for con range(1, 11) per produrre i moltiplicatori da 1 a 10.

for i in range(1, 11):
print(7 * i)

Ogni riga mostra un multiplo diverso di 7.

Stampare tutti i numeri pari da 0 a 20.

Soluzione spiegata

Possiamo usare range() con passo 2.

for numero in range(0, 21, 2):
print(numero)

Il terzo argomento di range() indica quanto avanzare a ogni iterazione.

Calcolare il fattoriale di un numero intero positivo.

Soluzione spiegata

Il fattoriale si ottiene moltiplicando tutti i numeri da 1 a n.

n = int(input("n: "))
fattoriale = 1
for i in range(1, n + 1):
fattoriale *= i
print(fattoriale)

La variabile fattoriale parte da 1 e cresce a ogni moltiplicazione.

Contare quante cifre ha un numero intero positivo.

Soluzione spiegata

Convertiamo il numero in stringa e usiamo len().

numero = input("Numero: ")
print(len(numero))

Ogni carattere della stringa corrisponde a una cifra del numero inserito.

Calcolare la somma delle cifre di un numero intero positivo.

Soluzione spiegata

Scorriamo il numero come stringa e convertiamo ogni cifra in intero.

numero = input("Numero: ")
totale = 0
for cifra in numero:
totale += int(cifra)
print(totale)

Ogni carattere viene trasformato in numero e aggiunto al totale finale.

Contare quante vocali ci sono in una parola.

Soluzione spiegata

Controlliamo ogni lettera e aumentiamo il contatore solo se è una vocale.

parola = input("Parola: ").lower()
conteggio = 0
for lettera in parola:
if lettera in "aeiou":
conteggio += 1
print(conteggio)

La conversione in minuscolo evita di gestire separatamente maiuscole e minuscole.

Leggere base e altezza e stampare un rettangolo pieno di asterischi. Alla fine, stampare anche il numero totale di asterischi usati.

Soluzione spiegata

Usiamo un ciclo per stampare ogni riga del rettangolo e poi calcoliamo quante celle contiene in totale.

base = int(input("Base: "))
altezza = int(input("Altezza: "))
for _ in range(altezza):
print("*" * base)
totale = base * altezza
print("Totale asterischi:", totale)

Il ciclo controlla il numero di righe, mentre "*" * base costruisce ogni riga del rettangolo.

Determinare la lunghezza di una stringa.

Soluzione spiegata

La funzione len() restituisce il numero di caratteri presenti.

testo = input("Testo: ")
print(len(testo))

Anche gli spazi vengono contati come caratteri.

Contare quante volte compare una lettera in una parola.

Soluzione spiegata

Usiamo il metodo count() della stringa.

parola = input("Parola: ").lower()
lettera = input("Lettera: ").lower()
print(parola.count(lettera))

Il metodo restituisce quante occorrenze della sottostringa sono presenti.

Invertire una stringa.

Soluzione spiegata

Lo slicing con passo -1 produce la stringa al contrario.

testo = input("Testo: ")
print(testo[::-1])

È un modo molto compatto per leggere i caratteri dalla fine all’inizio.

Verificare se una parola è palindroma.

Soluzione spiegata

Una parola è palindroma se è uguale alla sua versione invertita.

parola = input("Parola: ").lower()
if parola == parola[::-1]:
print("Palindroma")
else:
print("Non palindroma")

Il confronto finale decide subito tra i due casi.

Contare quante parole contiene una frase.

Soluzione spiegata

split() divide la frase in una lista di parole separate dagli spazi.

frase = input("Frase: ")
parole = frase.split()
print(len(parole))

Dopo la divisione, basta contare gli elementi della lista ottenuta.

Sostituire tutti gli spazi di una frase con trattini.

Soluzione spiegata

Il metodo replace() cambia tutte le occorrenze richieste.

frase = input("Frase: ")
nuova_frase = frase.replace(" ", "-")
print(nuova_frase)

Il testo originale non viene modificato: replace() restituisce una nuova stringa.

Stampare le iniziali di nome e cognome.

Soluzione spiegata

Leggiamo due parole e prendiamo il primo carattere di ciascuna.

nome = input("Nome: ")
cognome = input("Cognome: ")
iniziali = nome[0] + cognome[0]
print(iniziali.upper())

upper() rende le iniziali più leggibili.

Estrarre il nome utente da un indirizzo email.

Soluzione spiegata

La parte prima di @ si ottiene dividendo la stringa in due pezzi.

email = input("Email: ")
nome_utente = email.split("@")[0]
print(nome_utente)

L’indice 0 seleziona la prima parte del risultato di split().

Determinare la parola più lunga in una frase.

Soluzione spiegata

Dividiamo la frase e aggiorniamo una variabile ogni volta che troviamo una parola più lunga.

frase = input("Frase: ")
parole = frase.split()
piu_lunga = ""
for parola in parole:
if len(parola) > len(piu_lunga):
piu_lunga = parola
print(piu_lunga)

Alla fine del ciclo, piu_lunga contiene la parola richiesta.

Contare quante consonanti contiene una parola.

Soluzione spiegata

Una consonante è una lettera alfabetica che non appartiene all’insieme delle vocali.

parola = input("Parola: ").lower()
conteggio = 0
for lettera in parola:
if lettera.isalpha() and lettera not in "aeiou":
conteggio += 1
print(conteggio)

Il controllo con isalpha() evita di contare simboli o numeri.

Stampare il primo e l’ultimo elemento di una lista.

Soluzione spiegata

Gli indici 0 e -1 permettono di accedere all’inizio e alla fine della lista.

numeri = [4, 8, 15, 16, 23, 42]
print(numeri[0])
print(numeri[-1])

L’indice negativo conta gli elementi a partire dalla fine.

Calcolare la somma degli elementi di una lista di numeri.

Soluzione spiegata

Sommiamo gli elementi uno alla volta in una variabile accumulatrice.

numeri = [3, 5, 7, 9]
totale = 0
for numero in numeri:
totale += numero
print(totale)

Il ciclo visita tutti gli elementi della lista e aggiorna il totale.

Trovare il valore massimo in una lista di numeri senza usare max().

Soluzione spiegata

Partiamo dal primo elemento e lo sostituiamo quando troviamo un valore più grande.

numeri = [12, 7, 19, 4, 25, 10]
massimo = numeri[0]
for numero in numeri:
if numero > massimo:
massimo = numero
print(massimo)

La variabile massimo conserva sempre il valore migliore trovato fin lì.

Contare quante volte compare un valore in una lista.

Soluzione spiegata

Possiamo usare direttamente count() sulla lista.

numeri = [2, 4, 2, 6, 2, 8]
valore = 2
print(numeri.count(valore))

Il metodo restituisce il numero di occorrenze dell’elemento cercato.

Sostituire un elemento di una lista in una posizione data.

Soluzione spiegata

Le liste sono modificabili, quindi basta assegnare un nuovo valore all’indice richiesto.

colori = ["rosso", "verde", "blu"]
colori[1] = "giallo"
print(colori)

Dopo l’assegnazione, la lista contiene il nuovo elemento nella posizione scelta.

Aggiungere un elemento a una lista solo se non è già presente.

Soluzione spiegata

Controlliamo la presenza con in prima di chiamare append().

frutta = ["mela", "banana", "pera"]
nuovo = input("Frutto: ")
if nuovo not in frutta:
frutta.append(nuovo)
print(frutta)

In questo modo evitiamo di inserire duplicati indesiderati.

Unire due liste in una sola.

Soluzione spiegata

extend() aggiunge in fondo tutti gli elementi della seconda lista.

lista1 = [1, 2, 3]
lista2 = [4, 5, 6]
lista1.extend(lista2)
print(lista1)

Alla fine lista1 contiene tutti i valori delle due sequenze.

Stampare una lista al contrario.

Soluzione spiegata

Lo slicing permette di ottenere facilmente la versione invertita.

lettere = ["a", "b", "c", "d"]
print(lettere[::-1])

La lista originale resta invariata e viene prodotta una nuova sequenza.

Eliminare i duplicati da una lista mantenendo il primo ordine di comparsa e costruire anche una seconda lista con i valori che comparivano più di una volta.

Soluzione spiegata

Scorriamo la lista originale una volta sola. I valori mai visti finiscono nella lista principale, mentre i ripetuti finiscono in una lista separata senza essere duplicati più volte.

numeri = [3, 1, 3, 2, 1, 4, 2]
senza_duplicati = []
duplicati = []
for numero in numeri:
if numero not in senza_duplicati:
senza_duplicati.append(numero)
elif numero not in duplicati:
duplicati.append(numero)
print(senza_duplicati)
print(duplicati)

La prima lista conserva l’ordine originale dei valori distinti, mentre la seconda segnala quali valori erano ripetuti.

Calcolare la media degli elementi di una lista.

Soluzione spiegata

Sommiamo i valori e dividiamo per la lunghezza della lista.

numeri = [6, 8, 7, 9]
media = sum(numeri) / len(numeri)
print(media)

La funzione len() serve a sapere quanti elementi partecipano alla media.

Estrarre i primi tre e gli ultimi tre elementi di una lista.

Soluzione spiegata

Usiamo due operazioni di slicing diverse sulla stessa lista.

numeri = [1, 2, 3, 4, 5, 6, 7, 8]
print(numeri[:3])
print(numeri[-3:])

Il primo taglio prende dall’inizio, il secondo parte dalla fine.

Ordinare una lista in ordine crescente e poi in ordine decrescente.

Soluzione spiegata

Possiamo creare nuove liste ordinate senza modificare l’originale.

numeri = [5, 2, 9, 1, 7]
crescente = sorted(numeri)
decrescente = sorted(numeri, reverse=True)
print(crescente)
print(decrescente)

sorted() restituisce una nuova lista già ordinata.

Copiare una lista senza condividere lo stesso riferimento.

Soluzione spiegata

Per ottenere una copia vera usiamo il metodo copy().

originale = [10, 20, 30]
copia = originale.copy()
copia.append(40)
print(originale)
print(copia)

La modifica della copia non cambia la lista originale.

Calcolare la somma di tutti gli elementi di una matrice 2x3.

Soluzione spiegata

Una matrice può essere rappresentata come lista di liste.

matrice = [
[1, 2, 3],
[4, 5, 6]
]
totale = 0
for riga in matrice:
for valore in riga:
totale += valore
print(totale)

Il doppio ciclo permette di visitare tutte le celle della matrice.

Calcolare somma e prodotto dei valori contenuti in una tupla.

Soluzione spiegata

Una tupla si attraversa come una lista, anche se non si può modificare.

valori = (2, 3, 4)
somma = 0
prodotto = 1
for valore in valori:
somma += valore
prodotto *= valore
print(somma)
print(prodotto)

Usiamo due variabili diverse perché le due operazioni crescono in modo differente.

Scambiare le due coordinate di una tupla.

Soluzione spiegata

Con l’unpacking possiamo separare i due valori e ricostruire la tupla invertita.

punto = (5, 8)
x, y = punto
scambiato = (y, x)
print(scambiato)

Il nuovo risultato conserva gli stessi dati ma in ordine opposto.

Contare quanti valori distinti ci sono in una lista usando set.

Soluzione spiegata

Un insieme elimina automaticamente i duplicati.

numeri = [1, 2, 2, 3, 4, 4, 4, 5]
distinti = set(numeri)
print(len(distinti))

Dopo la conversione, ogni valore compare una sola volta.

Trovare l’intersezione di due insiemi.

Soluzione spiegata

L’operatore & restituisce gli elementi presenti in entrambi gli insiemi.

a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a & b)

Il risultato contiene solo i valori comuni.

Trovare la differenza tra due insiemi.

Soluzione spiegata

L’operatore - conserva gli elementi del primo insieme non presenti nel secondo.

a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a - b)

In questo caso il risultato mostra solo i valori esclusivi di a.

Verificare se un insieme è sottoinsieme di un altro.

Soluzione spiegata

Il metodo issubset() controlla se tutti gli elementi del primo insieme compaiono anche nel secondo.

piccolo = {2, 4}
grande = {1, 2, 3, 4, 5}
print(piccolo.issubset(grande))

Il risultato è un valore booleano: True oppure False.

Dato un dizionario di nomi e voti, stampare il voto associato a un nome.

Soluzione spiegata

Accediamo al valore usando la chiave corrispondente.

voti = {
"anna": 8,
"luca": 7,
"marta": 9
}
nome = input("Nome: ").lower()
print(voti[nome])

La chiave scelta determina quale valore del dizionario viene letto.

Aggiornare il voto di uno studente in un dizionario.

Soluzione spiegata

Basta assegnare un nuovo valore alla chiave desiderata.

voti = {
"anna": 8,
"luca": 7,
"marta": 9
}
voti["luca"] = 10
print(voti)

Se la chiave esiste già, il vecchio valore viene sostituito.

Calcolare la media dei valori contenuti in un dizionario di voti.

Soluzione spiegata

Ci interessano solo i valori numerici del dizionario.

voti = {
"anna": 8,
"luca": 7,
"marta": 9
}
media = sum(voti.values()) / len(voti)
print(media)

values() restituisce una vista di tutti i voti presenti.

Contare la frequenza delle lettere in una frase usando un dizionario, ignorando gli spazi, e stampare anche la lettera più frequente.

Soluzione spiegata

Aggiorniamo il dizionario solo per i caratteri utili. Poi scorriamo le coppie lettera-conteggio per trovare il massimo.

frase = input("Frase: ").lower()
frequenze = {}
for lettera in frase:
if lettera == " ":
continue
if lettera not in frequenze:
frequenze[lettera] = 0
frequenze[lettera] += 1
print(frequenze)
lettera_massima = ""
frequenza_massima = 0
for lettera, frequenza in frequenze.items():
if frequenza > frequenza_massima:
lettera_massima = lettera
frequenza_massima = frequenza
print(lettera_massima, frequenza_massima)

Ogni chiave del dizionario rappresenta una lettera diversa, mentre le ultime variabili tengono traccia del valore più alto trovato.

Creare un dizionario che associ ogni parola della lista alla sua lunghezza.

Soluzione spiegata

Per ogni parola salviamo il risultato di len() come valore.

parole = ["sole", "mare", "montagna"]
lunghezze = {}
for parola in parole:
lunghezze[parola] = len(parola)
print(lunghezze)

Il dizionario finale collega ogni testo alla sua misura in caratteri.

Invertire un dizionario con valori unici, scambiando chiavi e valori.

Soluzione spiegata

Creiamo un nuovo dizionario mettendo il valore come chiave e la chiave come valore.

numeri = {
"uno": 1,
"due": 2,
"tre": 3
}
invertito = {}
for chiave, valore in numeri.items():
invertito[valore] = chiave
print(invertito)

Questa soluzione funziona bene quando i valori iniziali non si ripetono.

Determinare la chiave associata al valore massimo in un dizionario.

Soluzione spiegata

Confrontiamo tutti i valori e memorizziamo la chiave migliore trovata.

punteggi = {
"anna": 15,
"luca": 21,
"marta": 18
}
chiave_massima = None
valore_massimo = None
for chiave, valore in punteggi.items():
if valore_massimo is None or valore > valore_massimo:
chiave_massima = chiave
valore_massimo = valore
print(chiave_massima)

Alla fine del ciclo, chiave_massima indica chi possiede il punteggio più alto.

Calcolare la somma di tutti i valori di un dizionario.

Soluzione spiegata

Scorriamo solo i valori numerici e li accumuliamo.

dati = {
"gennaio": 120,
"febbraio": 95,
"marzo": 110
}
totale = 0
for valore in dati.values():
totale += valore
print(totale)

Il metodo values() rende più chiaro che le chiavi qui non servono.

Verificare se una chiave è presente in un dizionario.

Soluzione spiegata

Anche per i dizionari possiamo usare l’operatore in.

contatti = {
"anna": "111111",
"luca": "222222",
"marta": "333333"
}
nome = input("Nome: ").lower()
if nome in contatti:
print("Presente")
else:
print("Assente")

Il controllo riguarda le chiavi del dizionario, non i valori.

Convertire una lista di coppie in un dizionario.

Soluzione spiegata

Ogni coppia contiene una chiave e il relativo valore.

coppie = [("rosso", "#ff0000"), ("verde", "#00ff00"), ("blu", "#0000ff")]
dizionario = {}
for chiave, valore in coppie:
dizionario[chiave] = valore
print(dizionario)

Il risultato finale ha la forma tipica di un dizionario Python.

Creare una funzione che stampi un saluto personalizzato.

Soluzione spiegata

La funzione riceve il nome come parametro e costruisce il messaggio.

def saluta(nome):
print(f"Ciao, {nome}!")
saluta("Giulia")
saluta("Paolo")

La stessa funzione può essere richiamata più volte con valori diversi.

Creare una funzione che restituisca il quadrato di un numero.

Soluzione spiegata

Qui serve return, perché vogliamo usare il risultato fuori dalla funzione.

def quadrato(numero):
return numero * numero
print(quadrato(5))
print(quadrato(9))

Il valore restituito può essere stampato o riutilizzato in altre espressioni.

Creare una funzione che restituisca il maggiore tra due numeri.

Soluzione spiegata

La logica è la stessa vista nelle condizioni, ma racchiusa dentro una funzione.

def maggiore(a, b):
if a > b:
return a
return b
print(maggiore(10, 7))
print(maggiore(4, 12))

La funzione isola il confronto e lo rende riutilizzabile.

Creare una funzione che calcoli la media di una lista di numeri e una seconda funzione che restituisca quanti valori sono almeno sufficienti rispetto a una soglia data.

Soluzione spiegata

Dividiamo il problema in due parti: una funzione calcola la media, l’altra conta quanti elementi superano o raggiungono la soglia.

def media(numeri):
if len(numeri) == 0:
return 0
return sum(numeri) / len(numeri)
def conta_sufficienti(numeri, soglia=6):
totale = 0
for numero in numeri:
if numero >= soglia:
totale += 1
return totale
voti = [6, 8, 5, 7, 9]
print(media(voti))
print(conta_sufficienti(voti))

La prima funzione produce un valore decimale, mentre la seconda restituisce un conteggio intero.

Creare una funzione che conti quante vocali ci sono in una stringa.

Soluzione spiegata

Portiamo il testo in minuscolo e contiamo solo le lettere presenti nell’insieme delle vocali.

def conta_vocali(testo):
totale = 0
for lettera in testo.lower():
if lettera in "aeiou":
totale += 1
return totale
print(conta_vocali("Programmazione"))

La funzione restituisce un numero intero con il conteggio finale.

Creare una funzione con un parametro predefinito per il saluto.

Soluzione spiegata

Il parametro di default viene usato solo se non viene passato un valore diverso.

def saluta(nome, saluto="Ciao"):
print(f"{saluto}, {nome}!")
saluta("Anna")
saluta("Luca", "Buongiorno")

Così la funzione resta flessibile senza obbligare sempre a scrivere tutto.

Creare una funzione che restituisca il minimo e il massimo di una lista.

Soluzione spiegata

La funzione restituisce due valori, che poi possiamo assegnare a due variabili.

def min_max(numeri):
return min(numeri), max(numeri)
piccolo, grande = min_max([4, 9, 1, 7, 3])
print(piccolo)
print(grande)

Python confeziona i due risultati in una tupla e poi li riassegna con l’unpacking.

Scrivere una funzione ricorsiva che calcoli il fattoriale di n.

Soluzione spiegata

Una funzione ricorsiva richiama se stessa finché raggiunge un caso base.

def fattoriale(n):
if n == 0 or n == 1:
return 1
return n * fattoriale(n - 1)
print(fattoriale(5))

Il caso base evita chiamate infinite e permette di risalire con i risultati.

Scrivere una funzione ricorsiva che calcoli la somma dei numeri da 1 a n.

Soluzione spiegata

Anche qui serve un caso base semplice da cui partire.

def somma_fino_a(n):
if n == 1:
return 1
return n + somma_fino_a(n - 1)
print(somma_fino_a(6))

Ogni chiamata somma il numero corrente al risultato della chiamata successiva.

Usare una lambda per raddoppiare un numero.

Soluzione spiegata

Una lambda è una funzione breve scritta in una sola espressione.

raddoppia = lambda x: x * 2
print(raddoppia(7))
print(raddoppia(15))

Qui la funzione anonima viene salvata in una variabile e poi richiamata come una funzione normale.

Scrivere in un file una piccola lista della spesa, mettendo ogni elemento su una riga numerata.

Soluzione spiegata

Prepariamo una lista di elementi e usiamo un ciclo con indice per scrivere righe più strutturate.

spesa = ["pane", "latte", "mele", "pasta"]
with open("spesa.txt", "w") as file:
for indice, elemento in enumerate(spesa, start=1):
file.write(f"{indice}. {elemento}\n")

Ogni iterazione produce una riga completa, già numerata e pronta da leggere.

Leggere un file di testo e contare quante righe contiene.

Soluzione spiegata

Scorriamo il file riga per riga e aumentiamo un contatore.

conteggio = 0
with open("appunti.txt", "r") as file:
for _ in file:
conteggio += 1
print(conteggio)

Il trattino basso _ indica che il contenuto della riga qui non ci serve.

Aggiungere una nuova riga alla fine di un file esistente.

Soluzione spiegata

La modalità "a" aggiunge contenuto senza cancellare quello che c’era già.

with open("appunti.txt", "a") as file:
file.write("quarta riga\n")

Il nuovo testo viene inserito in fondo al file.

Copiare il contenuto di un file dentro un altro file.

Soluzione spiegata

Prima leggiamo tutto il testo del file sorgente, poi lo scriviamo nel file destinazione.

with open("appunti.txt", "r") as sorgente:
contenuto = sorgente.read()
with open("copia_appunti.txt", "w") as destinazione:
destinazione.write(contenuto)

Questa soluzione è semplice e funziona bene per file di piccole dimensioni.

Leggere un file se esiste, altrimenti stampare un messaggio di errore semplice.

Soluzione spiegata

try/except ci permette di gestire il caso in cui il file non sia disponibile.

try:
with open("dati.txt", "r") as file:
print(file.read())
except FileNotFoundError:
print("Il file non esiste.")

Se Python solleva FileNotFoundError, il programma non si interrompe e mostra il messaggio scelto.

Gestire una divisione per zero usando try/except.

Soluzione spiegata

Mettiamo la divisione nel blocco try e intercettiamo ZeroDivisionError.

a = int(input("Primo numero: "))
b = int(input("Secondo numero: "))
try:
print(a / b)
except ZeroDivisionError:
print("Non puoi dividere per zero.")

L’errore viene gestito in modo controllato senza bloccare il programma.

Gestire l’inserimento di un intero non valido usando try/except.

Soluzione spiegata

L’errore da intercettare in questo caso è ValueError.

testo = input("Inserisci un numero intero: ")
try:
numero = int(testo)
print(numero)
except ValueError:
print("Valore non valido.")

Se il testo non può essere convertito in intero, Python entra nel blocco except.

Calcolare la radice quadrata di un numero usando il modulo math.

Soluzione spiegata

Prima importiamo il modulo, poi richiamiamo la funzione adatta.

import math
numero = float(input("Numero: "))
radice = math.sqrt(numero)
print(radice)

Il prefisso math. serve per indicare che la funzione appartiene a quel modulo.

Salvare in un file JSON una lista di studenti, dove ogni studente è rappresentato da un dizionario con nome e voto.

Soluzione spiegata

Il modulo json può salvare non solo un dizionario singolo, ma anche strutture più ricche come una lista di dizionari.

import json
studenti = [
{"nome": "Anna", "voto": 8},
{"nome": "Luca", "voto": 7},
{"nome": "Marta", "voto": 9}
]
with open("studenti.json", "w") as file:
json.dump(studenti, file)

Il file creato conterrà tutti gli studenti in formato JSON, pronti per essere riletti più avanti.

Caricare un file JSON e stampare i valori letti.

Soluzione spiegata

json.load() ricostruisce il dizionario Python a partire dal file.

import json
with open("profilo.json", "r") as file:
dati = json.load(file)
print(dati["nome"])
print(dati["eta"])
print(dati["citta"])

Dopo il caricamento, i dati si usano come un normale dizionario.

Creare una classe Persona con attributi nome ed eta, un metodo saluta(), un metodo compleanno() e una rappresentazione leggibile con __str__().

Soluzione spiegata

Il costruttore inizializza i dati, un metodo stampa un messaggio, un altro aggiorna l’età e __str__() rende l’oggetto più leggibile.

class Persona:
def __init__(self, nome, eta):
self.nome = nome
self.eta = eta
def saluta(self):
print(f"Ciao, mi chiamo {self.nome} e ho {self.eta} anni.")
def compleanno(self):
self.eta += 1
def __str__(self):
return f"Persona(nome={self.nome}, eta={self.eta})"
persona = Persona("Elena", 18)
persona.saluta()
persona.compleanno()
print(persona)

self rappresenta l’istanza su cui il metodo sta lavorando, quindi ogni oggetto può avere dati e stato propri.

Creare una classe Contatore con i metodi incrementa() e reset().

Soluzione spiegata

L’oggetto deve conservare un valore interno che cambia nel tempo.

class Contatore:
def __init__(self):
self.valore = 0
def incrementa(self):
self.valore += 1
def reset(self):
self.valore = 0
contatore = Contatore()
contatore.incrementa()
contatore.incrementa()
print(contatore.valore)
contatore.reset()
print(contatore.valore)

I metodi modificano direttamente l’attributo dell’istanza.

Creare una classe Rettangolo con i metodi area() e perimetro().

Soluzione spiegata

La classe incapsula i dati del rettangolo e i calcoli collegati.

class Rettangolo:
def __init__(self, base, altezza):
self.base = base
self.altezza = altezza
def area(self):
return self.base * self.altezza
def perimetro(self):
return 2 * (self.base + self.altezza)
r = Rettangolo(5, 3)
print(r.area())
print(r.perimetro())

Usare metodi rende il codice più leggibile e riutilizzabile.

Creare una classe Studente con attributo di classe scuola e metodo __str__().

Soluzione spiegata

L’attributo di classe è condiviso da tutte le istanze, mentre __str__() decide come stamparle.

class Studente:
scuola = "Liceo Scientifico"
def __init__(self, nome, voto):
self.nome = nome
self.voto = voto
def __str__(self):
return f"{self.nome} - voto: {self.voto} - scuola: {self.scuola}"
studente = Studente("Marco", 8)
print(studente)

Quando usiamo print(studente), Python richiama automaticamente __str__().

Creare una classe Animale e una sottoclasse Cane che ridefinisca il metodo verso().

Soluzione spiegata

L’ereditarietà permette di partire da una classe base e specializzare il comportamento.

class Animale:
def verso(self):
print("Verso generico")
class Cane(Animale):
def verso(self):
print("Bau")
animale = Animale()
cane = Cane()
animale.verso()
cane.verso()

La sottoclasse Cane sostituisce il metodo della classe padre con una versione più specifica.

Creare una lista di oggetti Libro e stampare il titolo di ciascuno.

Soluzione spiegata

Una lista può contenere anche oggetti creati da una classe.

class Libro:
def __init__(self, titolo, autore):
self.titolo = titolo
self.autore = autore
libri = [
Libro("1984", "George Orwell"),
Libro("Il piccolo principe", "Antoine de Saint-Exupery"),
Libro("Dracula", "Bram Stoker")
]
for libro in libri:
print(libro.titolo)

Il ciclo attraversa la lista e legge l’attributo titolo di ogni oggetto.

Creare una classe ContoBancario con i metodi deposita() e preleva().

Soluzione spiegata

Il prelievo deve avvenire solo se il saldo è sufficiente.

class ContoBancario:
def __init__(self, saldo_iniziale):
self.saldo = saldo_iniziale
def deposita(self, importo):
self.saldo += importo
def preleva(self, importo):
if importo <= self.saldo:
self.saldo -= importo
else:
print("Saldo insufficiente")
conto = ContoBancario(100)
conto.deposita(50)
conto.preleva(30)
conto.preleva(200)
print(conto.saldo)

La logica della gestione del saldo resta tutta dentro la classe.

Leggere voti da un file, calcolare la media con una funzione, determinare il voto massimo e contare quanti voti sono sufficienti.

Soluzione spiegata

Qui uniamo file, liste e funzioni in un programma più completo, con tre elaborazioni diverse sugli stessi dati.

def leggi_voti(nome_file):
voti = []
with open(nome_file, "r") as file:
for riga in file:
voti.append(float(riga.strip()))
return voti
def media(numeri):
if len(numeri) == 0:
return 0
return sum(numeri) / len(numeri)
def conta_sufficienti(numeri, soglia=6):
totale = 0
for numero in numeri:
if numero >= soglia:
totale += 1
return totale
with open("voti.txt", "w") as file:
file.write("8\n")
file.write("7.5\n")
file.write("5.5\n")
file.write("9\n")
voti = leggi_voti("voti.txt")
print(media(voti))
print(max(voti))
print(conta_sufficienti(voti))

Una funzione legge i dati, le altre li elaborano e il programma principale coordina tutto in pochi passaggi chiari.

Contare la frequenza di ogni parola in una frase.

Soluzione spiegata

Questo esercizio riprende il conteggio con i dizionari, ma applicato alle parole invece che alle lettere.

frase = input("Frase: ").lower()
parole = frase.split()
frequenze = {}
for parola in parole:
if parola not in frequenze:
frequenze[parola] = 0
frequenze[parola] += 1
print(frequenze)

Alla fine ogni parola diversa compare come chiave con il relativo numero di occorrenze.

Gestire una piccola rubrica con dizionario e funzioni per aggiungere, cercare, aggiornare, rimuovere e mostrare contatti in ordine alfabetico.

Soluzione spiegata

L’idea è dividere il problema in funzioni piccole, ciascuna con un compito preciso, così la rubrica resta facile da estendere e leggere.

def aggiungi_contatto(rubrica, nome, numero):
rubrica[nome] = numero
def cerca_contatto(rubrica, nome):
if nome in rubrica:
return rubrica[nome]
return "Contatto non trovato"
def aggiorna_contatto(rubrica, nome, nuovo_numero):
if nome in rubrica:
rubrica[nome] = nuovo_numero
def rimuovi_contatto(rubrica, nome):
if nome in rubrica:
del rubrica[nome]
def mostra_contatti(rubrica):
for nome in sorted(rubrica):
numero = rubrica[nome]
print(nome, numero)
rubrica = {}
aggiungi_contatto(rubrica, "Anna", "111111")
aggiungi_contatto(rubrica, "Luca", "222222")
aggiungi_contatto(rubrica, "Marta", "333333")
aggiorna_contatto(rubrica, "Luca", "999999")
rimuovi_contatto(rubrica, "Anna")
print(cerca_contatto(rubrica, "Luca"))
mostra_contatti(rubrica)

Questo programma finale mette insieme dizionari, funzioni, condizioni e cicli in una struttura più vicina a una piccola applicazione reale.