python funzioni args kwargs

Le Funzioni in Python

Obiettivi della pillola

Alla fine di questa pillola saprai:

  • definire una funzione con def;
  • distinguere tra parametri posizionali e nominali;
  • utilizzare parametri opzionali (default values);
  • gestire un numero variabile di argomenti (*args e **kwargs).

Definizione base

Una funzione è un blocco di codice riutilizzabile che esegue un’azione specifica. In Python si definisce con la parola chiave def, seguita dal nome, parentesi tonde e due punti. Il corpo della funzione deve essere indentato.

def saluta(nome):
    """Questa funzione stampa un saluto."""
    messaggio = f"Ciao, {nome}!"
    return messaggio

# Chiamata della funzione
risultato = saluta("Mario")
print(risultato)  # Ciao, Mario!

Parametri Posizionali e Nominali

Quando chiami una funzione, puoi passare gli argomenti in due modi:

  • Posizionali: l’ordine è fondamentale. Il primo valore va al primo parametro, il secondo al secondo, ecc.
  • Nominali (Keyword): specifichi il nome del parametro. L’ordine non conta più.
def descrivi(animale, verso):
    print(f"Il {animale} fa {verso}")

# Posizionale (ordine corretto)
descrivi("cane", "bau")

# Nominale (ordine ininfluente)
descrivi(verso="miao", animale="gatto")

# Misto (i posizionali devono precedere i nominali!)
descrivi("mucca", verso="muu")

Parametri Opzionali (Default)

Puoi assegnare un valore predefinito a un parametro. Se chi chiama la funzione non fornisce quel valore, verrà usato quello di default. I parametri con default devono sempre essere definiti dopo quelli senza default.

# 'esponente' e opzionale, default = 2
def potenza(base, esponente=2):
    return base ** esponente

print(potenza(3))     # 3^2 = 9 (usa il default)
print(potenza(3, 3))  # 3^3 = 27 (sovrascrive il default)

Nota: Attenzione ai valori di default mutabili (come liste o dizionari). Vengono creati una volta sola alla definizione della funzione.

Numero variabile di argomenti

A volte non sai in anticipo quanti argomenti verranno passati alla funzione. Python offre due strumenti potenti per questo.

*args: Tupla di argomenti posizionali

L’asterisco * prima del nome del parametro raccoglie tutti gli argomenti posizionali extra in una tupla.

def somma_tutto(*numeri):
    # 'numeri' e una tupla: (10, 20, 30)
    totale = 0
    for n in numeri:
        totale += n
    return totale

print(somma_tutto(10, 20, 30))  # 60

**kwargs: Dizionario di argomenti nominali

Il doppio asterisco ** raccoglie gli argomenti nominali extra in un dizionario (Keyword ARGS).

def crea_profilo(nome, **dettagli):
    # 'dettagli' e un dizionario: {'eta': 18, 'citta': 'Roma'}
    print(f"Profilo di {nome}:")
    for chiave, valore in dettagli.items():
        print(f" - {chiave}: {valore}")

crea_profilo("Luca", eta=18, citta="Roma", sport="Calcio")

Unpacking degli argomenti

È possibile fare l’operazione inversa: se hai una lista o una tupla e vuoi passarne i valori come argomenti separati a una funzione, usa *.

coordinate = (10, 20)

def disegna_punto(x, y):
    print(f"Disegno punto a {x}, {y}")

# Unpacking: la tupla viene 'esplosa' nei due argomenti
disegna_punto(*coordinate)

In breve: usa parametri opzionali per semplificare le chiamate comuni e *args/**kwargs per rendere le tue funzioni flessibili e capaci di gestire input imprevisti.