🚀 Guida Completa alle Funzioni in Python

Scopri come organizzare il tuo codice in blocchi riutilizzabili e modulari con le funzioni

🎯 Cosa Sono le Funzioni e Perché Usarle

Le funzioni sono blocchi di codice riutilizzabili che eseguono operazioni specifiche. Usarle aiuta a:

Scrivere codice più pulito

Codice modulare e organizzato

Evitare ripetizioni

Principio DRY – Don’t Repeat Yourself

Facile manutenzione

Modifiche rapide e localizzate

Logica separata

Blocchi autonomi e testabili


🎯 Parametri e Argomenti in una Funzione

Parametri sono le variabili definite tra parentesi nella dichiarazione della funzione.
Argomenti sono i valori passati quando la funzione viene chiamata.

ESEMPIO 1: Parametri e Argomenti
def somma(a, b):  # a e b sono parametri
    return a + b

print(somma(5, 3))  # 5 e 3 sono argomenti
# Output: 8

💡 Spiegazione:

  • La funzione somma accetta due parametri, a e b, che rappresentano i valori che passiamo alla funzione
  • Quando chiamiamo la funzione con somma(5, 3), i numeri 5 e 3 sono gli argomenti
  • I parametri sono come variabili segnaposto che ricevono valori dagli argomenti


🔧 Tipologie di Parametri

Python supporta diversi tipi di parametri per flessibilità nella definizione delle funzioni:

1. Posizionali

Ricevono i valori in base all’ordine

2. Di default

Hanno un valore predefinito

3. Keyword

Specificati con nome parametro

4. Arbitrari

*args, **kwargs

ESEMPIO 2: Parametri con Valori di Default
def saluta(nome="Ospite"):
    return f"Ciao, {nome}!"

print(saluta())        # Output: "Ciao, Ospite!"
print(saluta("Anna"))  # Output: "Ciao, Anna!"

💡 Spiegazione:

  • La funzione saluta ha un parametro con valore predefinito "Ospite"
  • Quando chiamiamo saluta() senza argomenti, usa il valore di default
  • Quando chiamiamo saluta("Anna"), il parametro riceve il valore “Anna”


🛠️ Esercitazione Guidata: Convertitore di Valuta

Obiettivo: Creare una funzione che converta un importo da euro a dollari o viceversa.

📝 Passaggi suggeriti:

  1. Definire la funzione converti_valuta(importo, valuta)
  2. Se valuta è “EUR”, convertire in dollari moltiplicando per 1.1
  3. Se valuta è “USD”, convertire in euro dividendo per 1.1
  4. Restituire l’importo convertito con due decimali
Soluzione
def converti_valuta(importo, valuta):
    if valuta == "EUR":
        return round(importo * 1.1, 2)  # Converte in USD
    elif valuta == "USD":
        return round(importo / 1.1, 2)  # Converte in EUR

💡 Spiegazione:

  • La funzione round(x, 2) arrotonda il numero x a due decimali
  • Esempio: round(3.14159, 2) restituisce 3.14
  • Usiamo round per formattare l’importo in modo leggibile


🎯 10 Tracce di Esercitazioni con Soluzioni

1️⃣ Calcolatore di Sconto

Soluzione
def calcola_sconto(prezzo, percentuale_sconto):
    return round(prezzo - (prezzo * percentuale_sconto / 100), 2)

💡 Spiegazione: La funzione round arrotonda il risultato a due decimali.
Se il calcolo produce 8.9999, round(8.9999, 2) restituisce 9.00.

2️⃣ Conta le Vocali in una Frase

Soluzione
def conta_vocali(testo):
    vocali = "aeiouAEIOU"
    return sum(1 for lettera in testo if lettera in vocali)

💡 Spiegazione: Usiamo un comprehension per contare le vocali.
Ogni volta che una lettera è una vocale, aggiungiamo 1 alla somma.
sum è una funzione che somma i valori.

3️⃣ Simulatore di Punteggio Scolastico

Soluzione
def calcola_media(voti):
    return round(sum(voti) / len(voti), 2) if voti else 0

💡 Spiegazione: sum(voti) somma tutti i voti, len(voti) conta quanti sono,
la divisione calcola la media, e round la arrotonda a due decimali.

4️⃣ Convertitore di Secondi

Soluzione
def converti_secondi(secondi):
    ore = secondi // 3600
    minuti = (secondi % 3600) // 60
    secondi = secondi % 60
    return f"{ore:02}:{minuti:02}:{secondi:02}"

💡 Spiegazione: f"{ore:02}:{minuti:02}:{secondi:02}" è una f-string che formatta i numeri con due cifre,
aggiungendo uno zero davanti se necessario (es. 02 invece di 2).

5️⃣ Generatore di Password Casuali

Soluzione
import random
import string

def genera_password(lunghezza):
    caratteri = string.ascii_letters + string.digits + string.punctuation
    return ''.join(random.choice(caratteri) for _ in range(lunghezza))

💡 Spiegazione: string.ascii_letters contiene lettere, string.digits numeri,
string.punctuation simboli. random.choice seleziona caratteri casuali,
''.join(...) li unisce in una stringa.

6️⃣ Calcolo dell’Area di un Cerchio

Soluzione
import math

def calcola_area_cerchio(raggio):
    return round(math.pi * raggio ** 2, 2)

💡 Spiegazione: math.pi fornisce il valore di pi greco (π).
raggio ** 2 eleva il raggio al quadrato.
La funzione round viene usata per arrotondare il risultato a due decimali.

7️⃣ Contare le Occorrenze di una Parola in una Frase

Soluzione
def conta_occorrenze(parola, frase):
    return frase.lower().split().count(parola.lower())

💡 Spiegazione: frase.lower() converte tutta la frase in minuscolo, per ignorare le differenze tra maiuscole e minuscole.
.split() suddivide la frase in una lista di parole.
.count(parola.lower()) conta quante volte la parola appare nella lista.

8️⃣ Ordina una Lista di Numeri in Ordine Crescente

Soluzione
def ordina_lista(lista):
    return sorted(lista)

💡 Spiegazione: sorted(lista) restituisce una nuova lista con gli stessi elementi di lista,
ma ordinati in ordine crescente. È una funzione built-in di Python che gestisce automaticamente l’ordinamento.

9️⃣ Calcolare il Fattoriale di un Numero

Soluzione
def calcola_fattoriale(n):
    if n == 0 or n == 1:
        return 1
    else:
        return n * calcola_fattoriale(n - 1)

💡 Spiegazione: Il fattoriale di un numero n è il prodotto di tutti i numeri interi positivi minori o uguali a n.
La funzione è ricorsiva: significa che la funzione si richiama con valori decrescenti di n
fino a che n non diventa 0 o 1, dove il fattoriale è definito come 1.

🔟 Verifica se un Numero è Primo

Soluzione
def verifica_primo(n):
    if n <= 1:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

💡 Spiegazione: Un numero primo è un numero maggiore di 1 che non ha divisori tranne 1 e se stesso.
Il ciclo for i in range(2, int(n ** 0.5) + 1) verifica se n è divisibile per numeri da 2 fino alla radice quadrata di n.
Se n è divisibile per uno di questi numeri, non è primo.


🏢 Esercizio Complesso: Gestione Rete Aziendale

Un'azienda possiede una rete composta da switch, router e server.
Gestisci dinamicamente i dispositivi di rete con le loro configurazioni.

🎯 Funzionalità Richieste:

  1. Aggiungere un nuovo dispositivo (IP, Tipo, Nome, Stato)
  2. Visualizzare tutti i dispositivi
  3. Modificare lo stato di un dispositivo
  4. Eliminare un dispositivo tramite IP
  5. Ricercare dispositivo per IP
  6. Contare dispositivi per tipologia
  7. Visualizzare tutti gli IP assegnati
Codice da Completare
# Lista per memorizzare i dispositivi di rete (ogni dispositivo è una tupla)
dispositivi = []  # (IP, Tipo, Nome, Stato)

def aggiungi_dispositivo(ip, tipo, nome, stato="Attivo"):
    """Aggiunge un nuovo dispositivo alla rete, se l'IP non è già assegnato."""
    for dispositivo in dispositivi:
        if dispositivo[0] == ip:
            print("Errore: Indirizzo IP già esistente!")
            return False
    dispositivi.append( ______ )  # COMPLETARE: aggiungere la tupla corretta
    print(f"Dispositivo {nome} ({tipo}) aggiunto con IP {ip}.")
    return True

def visualizza_dispositivi():
    """Mostra tutti i dispositivi registrati nella rete."""
    if not dispositivi:
        print("Nessun dispositivo registrato.")
        return
    print("Elenco dispositivi:")
    for dispositivo in dispositivi:
        print(f"IP: {dispositivo[0]}, Tipo: {dispositivo[1]}, Nome: {dispositivo[2]}, Stato: {dispositivo[3]}")

def modifica_stato(ip, nuovo_stato):
    """Modifica lo stato di un dispositivo dato il suo indirizzo IP."""
    for i in range(len(dispositivi)):
        if dispositivi[i][0] == ip:
            dispositivi[i] = ______  # COMPLETARE: modificare solo lo stato della tupla
            print(f"Stato del dispositivo con IP {ip} aggiornato a {nuovo_stato}.")
            return
    print("Errore: Dispositivo non trovato.")

def elimina_dispositivo(ip):
    """Rimuove un dispositivo dalla rete tramite l'IP."""
    global dispositivi
    dispositivi = [ ______ for dispositivo in dispositivi if dispositivo[0] != ip]  # COMPLETARE: filtrare la lista
    print(f"Dispositivo con IP {ip} eliminato.")

def cerca_dispositivo(ip):
    """Cerca un dispositivo nella rete tramite l'IP e ne restituisce i dettagli."""
    for dispositivo in dispositivi:
        if dispositivo[0] == ip:
            print(f"Dispositivo trovato: {dispositivo}")
            return dispositivo
    print("Nessun dispositivo trovato con questo IP.")
    return None

def stampa_ip():
    """Mostra tutti gli indirizzi IP registrati."""
    ips = [ ______ for dispositivo in dispositivi]  # COMPLETARE: estrarre gli IP dalla lista di tuple
    print("Indirizzi IP registrati:", ", ".join(ips))

# TEST: Prova ad aggiungere alcuni dispositivi e testare le funzioni!

📋 Compiti da Completare:

  • Completare i punti mancanti nel codice per renderlo funzionante
  • Creare il main() per testare il codice con chiamate alle funzioni


💡 Suggerimenti per il Miglioramento del Codice

1

Nomi Chiari

Usa nomi significativi per variabili e funzioni

2

Commenti

Spiega cosa fa ogni parte del codice

3

Casi Particolari

Gestisci valori non validi e casi limite

Torna in alto