Gli Esercizi di Programmare in Python .it


Il miglior modo per imparare a programmare con Python velocemente è esercitarsi in maniera pratica!
Scorri questa pagina con calma: troverai esercizi svolti di programmazione Python su calcoli matematici, funzioni, stringhe, liste, algoritmi ricorsivi, moduli e tanto altro.
Per quanto si tratti di esercizi facili, qualora aveste bisogno di un aiuto potrete cliccare sul tasto "Mostra Soluzione" per vedere una delle possibile soluzioni da me scritte.
Tenete a mente che non sempre è presente una sola e unica modalità risolutiva: spesso anzi, ci sono parecchie strade che portano alla stessa destinazione...
e mentre alcune saranno brevi ed efficienti, altre lo saranno meno, ma non per questo sono da considerarsi sbagliate!
N.B: le soluzioni sono scritte utilizzando Python 3.6: alcuni aspetti e semplificazioni -vedi Formatted String Literals- non sono presenti in versioni precedenti di Python.
Se avete dei suggerimenti o delle considerazioni da fare riguardo agli esercizi o alle soluzioni proposte potete visitare la sezione contatti.
Buon allenamento!

P.S. Sto lavorando a un pdf stra pieno di esercizi di programmazione Python! Se ti interessa riceverlo gratuitamente non appena sarà pronto, allora corri nella nostra HOME e iscriviti subito al News Letter Group! Lo invieró a tutti i membri non appena sarà pronto




Esercizio 001: Max tra Due Numeri

Scrivi una funzione che prende due numeri come parametro e restituisce il più grande tra i due: per quanto Python disponga di una funzione max(), sei invitato a utilizzare le istruzioni If, Elif ed Else per la scrittura dell'algoritmo.

Mostra Soluzione
def my_max(a,b):
    if a == b:
        print('I numeri sono identici')
    elif a > b:
        print('Il numero più grande tra i due è ' + str(a))
    else:
        print('Il numero più grande tra i due è ' + str(b))

my_max(float(input()),float(input()))



Esercizio 002: Max tra Tre Numeri

Scrivi una funzione che prende stavolta tre numeri come parametro e restituisce il più grande tra loro!

Mostra Soluzione
def my_max_of_three(a,b,c):
    if a >= b and a >= c:
        print(a)
    elif b >= a and b >= c:
        print(b)
    elif c >= a and c >= b:
        print(c)
    
my_max_of_three(float(input()),float(input()),float(input()))



Esercizio 003: Sei una Vocale?

Scrivi una funzione a cui viene passato un carattere come parametro, e che restituisce se il carattere è o meno una vocale.

Mostra Soluzione
def cerca_vocali(carattere):
    vocali = "aeiou"
    if carattere in vocali:
        print('Il carattere "' + carattere + '" è una vocale')
    else:
        print('Il carattere "' + carattere + '" non è una vocale')

cerca_vocali(input('Inserisci il carattere da analizzare -> '))



Esercizio 004: Sommatrice Inarrestabile

Scrivi una funzione "sommatrice" che somma tra loro tutti gli elementi di una lista di numeri.

Mostra Soluzione
def sommatore(lista):
    risultato = 0
    for numero in lista:
        risultato += numero
    print('Il risultato della somma è... ' + str(risultato))
    
    sommatore([2,4,6,8,10])



Esercizio 005: Moltiplicatore Inarrestabile

Scrivi una funzione "moltiplicatrice" che moltiplica tra loro tutti gli elementi di una lista di numeri.

Mostra Soluzione
def moltiplicatore(lista):
    risultato = 1
    for numero in lista:
        if numero != 0:
            risultato *= numero
    print('Il risultato della moltiplicazione tra tutti gli elementi della lista è... ' + str(risultato))



Esercizio 006: Reverser

Scrivi una funzione a cui passaerai come parametro una stringa e ti restituirà una versione della stessa stringa al contrario (ad esempio "abcd" diventa "dcba".

Mostra Soluzione
def reverser(stringa):
    indice = (len(stringa) -1)
    nuova_stringa = ""
    while indice >= 0:
        nuova_stringa += stringa[indice]
        indice -= 1
    print(nuova_stringa)

reverser("ab cd")



Esercizio 007: Palindromo... o non Palindromo?

Scrivi una funzione a cui viene passata una parola e riconosce se si tratta di un palindromo(parole che si leggono uguali anche al contrario) oppure meno.

Mostra Soluzione
def testa_parole(parola):
    indice = (len(parola) -1)
    nuova_parola = ""
    while indice >= 0:
        nuova_parola += parola[indice]
        indice -= 1
    if nuova_parola == parola:
        print('La parola passata è un palindromo! ' + nuova_parola)
    else:
        print('Mi dispiace, la parola inserita non è un palindromo...')



Esercizio 008: Scriviamo la nostra versione di len()

Scrivi una funzione che restituisce la lunghezza di una stringa o lista passata come parametro(in sostanza provate a scrivere la vostra versione della funzione len() ).

Mostra Soluzione
def mia_len(lista_o_stringa):
    lunghezza = 0
    for unità in lista_o_stringa:
        lunghezza += 1
    print('La Lista o Stringa passata alla funzione ha una lunghezza di ' + str(lunghezza))


mia_len(['asd',2,66,'Roma',3.14])



Esercizio 009: Generatore di Istogrammi

Scrivi una funzione che, data una lista di numeri, fornisce in output un istogramma basato su questi numeri, usando asterischi per disegnarlo. Ad esempio, data la lista [3,7,9,5] deve produrre questo grafico:

***

*******

*********

*****

Mostra Soluzione
def istogramma(lista):
    for numero in lista:
        print("*" * numero)

lista = [3,7,9,5]
istogramma(lista)



Esercizio 010: A ciascuno il suo

Scrivi una funzione che, data in ingresso una lista A contenente parole, restituisce in output una lista B di interi che rappresentano la lunghezza delle parole contenute in A.

Mostra Soluzione
def contatore(listaA):
    listaB = []
    for parola in listaA:
        listaB.append(len(parola))
    print(listaB)
contatore(['Milano','Roma','Cagliari','Croazia','Giappone'])

#oppure una versione più efficiente usando il "list comprehension":
listaA = ['Milano','Roma','Cagliari','Croazia','Giappone']
listaB = [len(parola) for parola in listaA]



Esercizio 011: Il Maggiore tra tutti!

Scrivi un programma che, passata come parametro una lista di interi, fornisce in output il maggiore tra i numeri contenuti nella lista.

Mostra Soluzione
def max_in_list(lista):
    max = 0
    for numero in lista:
        if numero > max:
            max = numero
    print('Il numero più grande della lista passata è ' + str(max))

lista = [9,33,1,3,2,4,22]
max_in_list(lista)



Esercizio 012: Il linguaggio dei furfanti

In Svezia, i bambini giocano spesso utilizzando un linguaggio un pó particolare, detto "rövarspråket", che significa "linguaggio dei furfanti": consiste nel raddoppiare ogni consonante di una parola e inserire una "o" nel mezzo. Ad esempio la parola "mangiare" diventa "momanongogiarore". Scrivi una funzione in grado di tradurre una parola o frase passata tramite input() in "rövarspråket".

Mostra Soluzione
def traduttore():
    vocali = "aeiou"
    specials = [" ", ",", ".", "?", "!", '"',"'"]
    print('''Ciao! questo programma traduce un testo passato in "rövarspråket".
    Ció significa che raddoppia ogni consonante delle parole e ci mette una "o" in mezzo...''')
    while True:
        testo = input('\nInserisci il testo che desideri tradurre ---> ')
        tradotta = ""
        for x in testo:
            if x in vocali or x in specials:
                tradotta += x #tradotta = tradotta + x
            else:
                tradotta = tradotta + x + "o" + x                
        print(f"Ecco a te la traduzione! '{tradotta}'")
        if input("\nDesidere tradurre un'altra frase? ") == "no":
            break



Esercizio 013: Solamente per Soci

Scrivi una funzione membro_di() a cui vengono passati un valore e una Lista di valori, e ci dice in output se il valore è presente nella Lista.

Mostra Soluzione
def membro_di(char,lista):
    presente = False
    for carattere in lista:
        if carattere == char:
            presente = True
            break
    if presente == True:
        print(f"Il carattere '{char}' è presente nella lista passata, all'indice {lista.index(char)}!")
    else:
        print(f"Il carattere '{char}' NON è presente nella lista passata..")

membro_di("x",[2,3,4,"x","z",7,1])



Esercizio 014: Il Frequenzimetro

Scrivi una funzione a cui passare una stringa come parametro, e che restituisce un elenco rappresentante la frequenza di ciscun carattere componente la stringa(ad esempio: data una stringa "ababcc", otterremo in risultato a: 2; b: 2; c: 2. Suggerimento: è consigliabile utilizzare un dizionario!

Mostra Soluzione
def frequenza_car(stringa):
    mappa = {}
    for carattere in stringa:
        if carattere in mappa:
            mappa[carattere] += 1
        else:
            mappa[carattere] = 1
    print(mappa.items())



Esercizio 015: Il Geometra

Scrivi una funzione che, a scelta dell'Utente, calcoli l'area di: un Cerchio, un Quadrato, un Rettangolo, un Triangolo.

Mostra Soluzione
def geometra():
    print("""Benvenuto alla funzione Geometra!
A ciascun possibile calcolo corrisponde un valore numerico:
- Area Quadrato @ 1
- Area Rettangolo @ 2
- Area Triangolo @ 3
- Area Cerchio @ 4""")
    print('\nOk, dunque. Di quale figura geometrica desideri calcolare l'area?')
    scelta = int(input('--->'))
    if scelta == 1:
            print("Hai scelto: Area Quadrato")
            lato = float(input('Inserisci il valore del lato del quadrato '))
            print(f"L'Area del Quadrato, avente lato {lato} è: {lato*lato}")
    elif scelta == 2:
            print("Hai scelto: Area Rettangolo")
            base = float(input('Inserisci il valore della base '))
            altezza = float(input('Inserisci il valore dell´altezza '))
            print(f"L'Area del Rettangolo, avente base {base} e altezza {altezza} è: {base*altezza}")                  
    elif scelta == 3:
            print("Hai scelto: Area Triangolo")
            base = float(input('Inserisci il valore della base '))
            altezza = float(input('Inserisci il valore dell´altezza '))
            print(f"L'Area del Triangolo, avente base {base} e altezza {altezza} è: {(base*altezza)/2}")                  
    elif scelta == 4:
            print("Hai scelto: Area Cerchio")
            r = float(input('Inserisci il valore del raggio '))
            print(f"L'Area del Cerchio, avente raggio {r} è: {(r*r) * 3.14}")
    else:
            print ('Al  valore inserito non corrisponde alcun calcolo!')



Esercizio 016: Generatore di Password

Scrivi una funzione generatrice di password. La funzione deve generare una stringa alfanumerica di 8 caratteri qualora l'utente voglia una password semplice, o di 20 caratteri ascii qualora desideri una password più complicata.

Mostra Soluzione
import random

def psw_generator():
    print('Benvenuti nel generatore di password. Il programma permette di scegliere tra due livelli di complessità della password.')
    full_char_table = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~"
    alpha_char_table = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    
    if input("Desideri una password semplice(8 caratteri alfanumerici) o difficile(20 caratteri ascii)?  S/D ") == "D":
        lunghezza = 20
        tipo = full_char_table
    else:
        lunghezza = 8
        tipo = alpha_char_table
    psw = ""
    x = 0
    for x in range(int(lunghezza)):
        psw += tipo[int(random.randrange(len(tipo)))]
        x += 1
        
    print("La password generata è : " + psw)



Esercizio 017: Funzione Fattoriale Ricorsiva

Scrivi una funzione Ricorsiva che calcola il fattoriale di un numero dato.

Mostra Soluzione
def fattoriale(n):
	if n == 1:	
		return n
	else:
		result = n * fattoriale(n-1)
		return result

num = int(input('Inserisci il numero da fattorizzare  -> '))
print(fattoriale(num))



Esercizio 018: La Serie di Fibonacci

Scrivi una funzione Ricorsiva che restituisce in output i numeri della sequenza di Fibonacci(ciascun numero della serie è la somma dei due numeri nella serie che lo precedono - 1,1,2,3,5,8,13... - ); fa si di richiamare la funzione entro una soglia di numeri imposto dall'utente

Mostra Soluzione
def fibonacci(n):
    if n <= 1:
        return n
    else:
        return (fibonacci(n-1) + fibonacci(n-2))


limite = int(input('Inserisci il numero di valori della serie che desideri vedere '))
for num in range(1,limite+1):
     print(fibonacci(num))



Esercizio 019: Funzione Genera MAC

Un indirizzo MAC (media access control address) è un indirizzo univoco associato dal produttore, a un chipset per comunicazioni wireless(es WiFi o Bluetooth), composto da 6 coppie alfanumeriche di caratteri. Un esempio di MAC è 02:33:A5:F2:55:12. Scrivi una funzione genera_MAC che generi degli indirizzi MAC a partire da coppie alfanumeriche casuali.

Mostra Soluzione
import random

def mac_gen():
    alphanum = "ABCDEF0123456789" #combo alfanumerica (0-F)
    mac = ""
    coppia = 0 #contatore per ciascuna coppia alfanumerica
    punti = 0 #contatore per i doppipunti che separano le varie coppie alfanumeriche (es: 02:44:B5:F7:54:FC)

    for val in range(6):
        while coppia < 2:
            mac += alphanum[int(random.randrange(16))] #it adds a value from the "alpha" string
            coppia += 1
        coppia = 0
        if punti < 5:
            mac += ":"
            punti += 1

    print(f"L'indirizzo MAC generato è {mac}") 



Esercizio 020: Poesia Elettronica

Scrivi una semplice funzione "rimario", a cui viene passato un elenco di parole, e lo confronta con una parola inserita dall'utente alla ricerca di rime(intese come parole le cui ultime 3 lettere siano uguali alla parola data!)

Mostra Soluzione
def rimario(elenco):
    rime = []
    parola = input("Inserisci la parola di cui desideri cercare le rime: ")
    for elemento in elenco:
        if elemento[-3:] == parola[-3:]:
            rime.append(elemento)

    if not rime:
        print("Non sono state trovate rime corrispondenti alla parola passata!")
    else:
        print(f"Le rime corrispondenti alla parola '{parola}' sono le seguenti: {rime}")

lista_parole = ["bere","fare","gestire","lavorare","albero","casa","hardware","cpu"]
rimario(lista_parole)



Esercizio 021: Crittografia ROT-13

Il ROT-13 è un semplice cifrario monoalfabetico, in cui ogni lettera del messaggio da cifrare viene sostituita con quella posta 13 posizioni più avanti nell'alfabeto. Scrivi una semplice funzione in grado di criptare una stringa passata, o decriptarla se la stringa è già stata precedentemente codificata.

Mostra Soluzione
cifrario = {'a':'n', 'b':'o', 'c':'p', 'd':'q', 'e':'r', 'f':'s', 'g':'t', 'h':'u',
       'i':'v', 'j':'w', 'k':'x', 'l':'y', 'm':'z', 'n':'a', 'o':'b', 'p':'c',
       'q':'d', 'r':'e', 's':'f', 't':'g', 'u':'h', 'v':'i', 'w':'j', 'x':'k',
       'y':'l', 'z':'m', 'A':'N', 'B':'O', 'C':'P', 'D':'Q', 'E':'R', 'F':'S',
       'G':'T', 'H':'U', 'I':'V', 'J':'W', 'K':'X', 'L':'Y', 'M':'Z', 'N':'A',
       'O':'B', 'P':'C', 'Q':'D', 'R':'E', 'S':'F', 'T':'G', 'U':'H', 'V':'I',
       'W':'J', 'X':'K', 'Y':'L', 'Z':'M'}
       
def sempli_crypto(stringa):
    nuova_stringa = ""
    for carattere in stringa:
        if carattere in cifrario:
            nuova_stringa += cifrario[carattere]
        else:
            nuova_stringa += carattere
    return nuova_stringa



Esercizio 022: Il Signore del Tempo

Scrivi una semplice funzione che calcoli in numero di secondi presente in un numero di giorni, ore e minuti passati dall'utente.

Mostra Soluzione
def dei_secondi():
    print("Hola! Questa funzione converte Giorni, Ore e Minuti(o una somma di essi!) in Secondi.")
    da_giorni = int(input("Inserisci il numero di giorni: ")) * 3600 *24
    da_ore = int(input("Inserisci il numero di ore: ")) * 3600
    da_minuti = int(input("Inserisci il numero di minuti: ")) * 60
    totale = da_giorni + da_ore + da_minuti
    return(totale)

print(dei_secondi())



Esercizio 023: L'Americana

Scrivi una funzione che, dato in ingresso un valore espresso in Metri, restituisca l'equivalente in Miglia Terrestri, Iarde, Piedi e Pollici.

Mostra Soluzione
def americanen(metri):
    miglia = metri / 1609.344
    piedi = metri * 3.280840
    pollici = metri * 39.37008
    iarde = metri * 1.093613
    output = (f"{metri} Metri corrispondono a \n{miglia} Miglia Terrestri\n{piedi} Piedi\n{pollici} Pollici\n{iarde} Iarde")
    return output

print(americanen(1024))



Esercizio 024: Info di Sistema

Scrivi una funzione che fornisca in Output il Sistema Utilizzato, Sistema Operativo e versione associata

Mostra Soluzione
import os, platform

def sys_info():
    print(f"Il Sistema attualmente in uso è: " + platform.system())
    print("OS rilevato: " + os.name())
    print("Aggiornato alla Versione: " + platform.release())

sys_info()



Esercizio 025: Trova ASCII

Scrivi una funzione che, dato un carattere in ingresso, restituisca in output il valore ASCII associato al carattere passato.

Mostra Soluzione
def trova_ascii():
    carattere = input("Inserisci il carattere che ti interessa convertire: ")
    valore = ord(carattere)
    output = f"Il valore ASCII associato a '{carattere}' è {valore}"
    return(output)



Esercizio 026: Il peso della cartella

Scrivi una funzione che calcoli la somma delle dimensioni dei file presenti nella Cartella in cui si sta Operando, e che la restituisca in output espressa in MB.

Mostra Soluzione
import os
def file_size(cartella = os.getcwd()):
    totale = 0
    for file in os.listdir(cartella):
        totale += os.path.getsize(os.path.join(cartella, file))
    output = f"La somma delle dimensioni dei file presenti nella cartella '{cartella}' è: {totale/1000000}MB"
    return(output)



Esercizio 027: La Libreria

Scrivi una funzione "vendi_libri" che:
-Controlla se il libro richiesto è presente sugli scaffali della libreria;
-Qualora il libro sia presente, ne decrementa il numero di copie(eventualmente rimuovendo il titolo) e ci segnala che la vendita ha avuto successo;
-Se il libro non è disponibile, viene messo in un elenco di libri da ordinare e ci viene comunicato che la vendita non ha avuto successo;
-La funzione restituisce valore Booleano True o False in base all'esito della vendita.

Mostra Soluzione
scaffale = {"Così parló Zarathustra":10,"Elon Musk - Biografia":7,"End Of Jobs":5,"L'Alchimista":1}

def vendi_libri(scaffale,libro):
    vendita = False
    ordini = []
    if libro in scaffale:
        vendita = True
        scaffale[libro] -= 1
        if scaffale[libro] == 0:
            del scaffale[libro]
        print(f"Il libro '{libro}' è stato venduto! \nDi seguito un elenco aggiornato dei volumi presenti nel nostro scaffale: \n{scaffale}")        
    else:
        print(f"Mi dispiace, ma il libro richiesto ({libro}) non è presente sul nostro scaffale! Sto effettuando un ordine!")
        ordini.append(libro)
    return(vendita)       
        
vendi_libri(scaffale,"Così parló Zarathustra")



Esercizio 028: Il Postino

Scrivi una funzione "postino" che sia in grado di spedire delle eMail tramite Gmail! (aiuto: Modulo smtplib)

Mostra Soluzione
import smtplib

def postino():
    print("""Questa è la funzione Postino: spedisce eMail utilizzando Gmail!
Server: smtp.gmail.com
Porta: 587
Si richiedono: Username, Password, Destinatario, Oggetto e Contenuto""")
    user_mittente = input("Inserisci l'Username --> ")
    password = input("Inserisci la Password --> ")
    destinatario = input("A chi stiamo spedendo questa Mail? ")
    oggetto = "Subject: " + input("Inserisci l'oggetto della Mail, quindi premi invio: ")
    contenuto = "\n\n" + input("Ora puoi inserire il contenuto Mail: ") #\n\n fa si che il contenuto venga separato dall'oggetto
    messaggio = oggetto + contenuto
    print("Sto effettuando la connessione col Server...")
    email = smtplib.SMTP("smtp.gmail.com",587) 
    email.ehlo() #effettuo l'hello col Server
    email.starttls() #avvio il canale TLS
    email.login(user_mittente,password) #effettuo il login
    print("Sto inviando...")
    email.sendmail(user_mittente,destinatario,messaggio)
    email.quit()
    print("Messaggio Inviato!")

postino()



Esercizio 029: La Cercatrice

Scrivi una funzione "cercatrice" che scansioni un dato percorso di sistema alla ricerca di file .pdf. La funzione deve avere le seguenti caratteristiche:


Il percorso fornito dev'essere anzitutto validato, in quanto deve portare a una cartella esistente;
Deve fornire un elenco dei file .pdf (con relativo percorso) man mano che questi vengono trovati;
In fine deve fornire in output il totale dei file .pdf che sono stati trovati durante la scansione.
Mostra Soluzione
import os

def cercatrice(percorso):
	contatore = 0
	if os.path.isdir(percorso) == True:
		print(f"Sto effettuando la scansione di '{percorso}' alla ricerca di file .pdf")
		print()
		for cartella, sottocartelle, files in os.walk(percorso):
		    for file in files:
		        if file.endswith(".pdf"):
		            pdf = os.path.join(cartella,file)
		            print(f"Trovato file pdf: {pdf}")  
		            contatore += 1     
		print("Scansione Ultimata.")
		print(f"Ho trovato '{contatore}' files con estensione pdf.")
	else:
		print(f"Il percorso inserito '{percorso}' risulta non essere un percorso idoneo. Verifica e riprova, grazie.")


path = "/home/programmareinpython/Documents"

cercatrice(path)



Esercizio 030: Il Salvatore

Scrivi una funzione "backup" che sia in grado di effettuare copie di backup di determinati tipi di file, con le seguenti caratteristiche:
-Percorso da Scansionare, Percorso della Cartella di Backup e Tipologia dei File da copiare vengono passate dall'Utente in esecuzione;
-Lo Script deve verificare la presenza o meno della Cartella di Backup al percorso fornito, e qualora non fosse presente crearla in maniera autonoma.

Mostra Soluzione
import os
import shutil

def file_backup():
	print("Hola hola! Questo script effettua copie di backup per file di un'estensione passata come input")
	print()
	percorso = input("Inserisci il percorso da scansionare: ")
	estensione = input("Che tipologia di file desideri salvare? [esempio: .jpg .pdf .epub] -> ")
	backup_folder = input("Inserisci la cartella dove desideri salvare i tuoi file: ")
	if os.path.isdir(backup_folder) == False:
		os.makedirs(backup_folder)
	contatore = 0
	if os.path.isdir(percorso) == True:
		print(f"Sto effettuando la scansione di '{percorso}' alla ricerca di file .pdf")
		print()
		for cartella, sottocartelle, files in os.walk(percorso):
		    for file in files:
		        if file.endswith(estensione):
		            match = os.path.join(cartella,file)
		            print(f"Trovato file {estensione}: {match}")  
		            shutil.copy(match,backup_folder)
		            contatore += 1     
		print("Copia Terminata")
		print(f"Ho trovato '{contatore}' files con estensione {estensione}, ora disponibili anche in '{backup_folder}'")
	else:
		print(f"Il percorso inserito '{percorso}' risulta non essere un percorso idoneo. Verifica e riprova, grazie.")

file_backup()