Esercizi di Programmazione Python

Il miglior modo per imparare a programmare con Python velocemente è fare tanta pratica.
In questa pagina troverai esercizi svolti di programmazione Python su funzioni, stringhe, liste, calcoli matematici, algoritmi ricorsivi e moduli. Volendo puoi anche cliccare sul tasto "Mostra Soluzione" per vedere una delle possibile soluzioni!
Ti ricordo inoltre che per insegnarti Python nel migliore dei modi abbiamo creato anche degli specifici tutorial e video corsi.
Buon allenamento, ed Happy Coding!

P.S. Iscrivendoti alla nostra newsletter hai la possibilità di ricevere sulla tua mail tutti gli aggiornamenti più importanti riguardanti il sito, le novità in uscita e nuovi esercizi.


Esercizio 001: Max tra Due Numeri

Scrivi una funzione che prende due numeri come parametro e manda in print 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.

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

Esercizio 002: Max tra Tre Numeri

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

def my_max_of_three(a, b, c):
    if a >= b and a >= c:
        return a
    elif b >= a and b >= c:
        return b
    elif c >= a and c >= b:
        return c

Esercizio 003: Sei una Vocale?

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

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

Esercizio 004: Sommatrice Inarrestabile

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

def sommatrice(lista):
    risultato = 0
    for numero in lista:
        risultato += numero
    print('Il risultato della somma è... ' + str(risultato))

Esercizio 005: Moltiplicatore Inarrestabile

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

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 passerai come parametro una stringa e ti restituirà una versione della stessa stringa al contrario (ad esempio "abcd" diventa "dcba".

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

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.

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 manda in print la lunghezza di una stringa o lista passata come parametro.
In sostanza, seppur presente, provate a scrivere la vostra versione della funzione len()!

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:

***

*******

*********

*****

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.

def contatore(listaA):
    listaB = []
    for parola in listaA:
        listaB.append(len(parola))
    print(listaB)

listaA = ['Milano','Roma','Cagliari','Croazia','Giappone']
contatore(mia_lista)

# 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.

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".

def traduttore():
    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...
    ''')

    vocali = "aeiou"
    specials = [" ", ",", ".", "?", "!", '"',"'"]
    
    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 a cui vengono passati un valore e una lista di valori, e che ti dica in output se il valore passato è presente o meno nella lista.

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 restituisca un dizionario rappresentante la frequenza di ciscun carattere componente la stringa. Ad esempio, data una stringa "ababcc", otterremo in risultato {"a": 2, "b": 2, "c": 2}.

def frequenza_car(stringa):
    mappa = {}
    for carattere in stringa:
        if carattere in mappa:
            mappa[carattere] += 1
        else:
            mappa[carattere] = 1
    return mappa

Esercizio 015: Il Geometra

Scrivi una funzione che, a scelta dell'utente, calcoli l'area di: -un cerchio -un quadrato -un rettangolo -un triangolo

def geometra():
    print("""
    Benvenuti alla funzione Geometra!
    A ciascun possibile calcolo corrisponde un valore numerico:
    - Area Quadrato @ 1
    - Area Rettangolo @ 2
    - Area Triangolo @ 3
    - Area Cerchio @ 4
    """)
    
    print('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 ('Nessun calcolo disponibile per la scelta effettuata!')

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.

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.

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

Esercizio 018: La Serie di Fibonacci

Nella serie di Fibonacci, ciascun numero della serie è la somma dei due numeri nella serie che lo precedono, ad esempio: 1, 1, 2, 3, 5, 8, 13...
Scrivi una funzione ricorsiva che restituisce in output i numeri della sequenza di Fibonacci, entro una soglia specifica impostata dall'utente.

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.

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!

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.

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 simple_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.

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)

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.

def american(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

Esercizio 024: Info di Sistema

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

import os
import platform

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

Esercizio 025: Trova ASCII

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

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 di una 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.

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


print(file_size())

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.

scaffale = {"Così parló Zarathustra": 10, "Elon Musk - Biografia": 7, "End Of Jobs": 5, "L'Alchimista": 1, "I Fratelli Karamazov": 2, "Delitto e Castigo": 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

Esercizio 028: Il Postino

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

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!")

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.

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.

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.")