Python - Guida alle Annotazioni delle Funzioni: Per Principianti

Ciao, aspiranti programmatori Python! Oggi entreremo nel fascinante mondo delle Annotazioni delle Funzioni. Non preoccupatevi se siete nuovi alla programmazione – vi guiderò attraverso questo concetto passo per passo, proprio come ho fatto per innumerevoli studenti durante gli anni della mia docenza. Allora, prenda il suo bevanda preferita, si rilassi e ci avviamo insieme su questa avventura Python!

Python - Function Annotations

Cosa sono le Annotazioni delle Funzioni?

Le annotazioni delle funzioni sono una caratteristica di Python che ci permette di aggiungere metadati ai parametri delle funzioni e ai valori restituiti. Pensatele come piccole note che attacchiamo alle nostre funzioni per fornire informazioni aggiuntive. Non influenzano il funzionamento della funzione, ma possono essere molto utili per la documentazione e il controllo dei tipi.

Iniziamo con un esempio semplice:

def saluta(nome: str) -> str:
return f"Ciao, {nome}!"

In questo esempio, : str dopo nome è un'annotazione che suggerisce che nome dovrebbe essere una stringa. Il -> str alla fine suggerisce che la funzione restituirà una stringa.

Perché usare le Annotazioni delle Funzioni?

  1. rendono il vostro codice più leggibile.
  2. aiutano altri sviluppatori (e il futuro voi!) a comprendere meglio il vostro codice.
  3. possono essere utilizzate da strumenti di controllo dei tipi per catturare errori potenziali.

Ora, scaviamo più a fondo nei diversi tipi di annotazioni!

Annotazioni delle Funzioni con Parametri

Possiamo annotare i parametri delle funzioni per indicare quale tipo di dati ci aspettiamo. Ecco un esempio:

def calcola_area(lunghezza: float, larghezza: float) -> float:
return lunghezza * larghezza

In questa funzione, stiamo dicendo che sia lunghezza che larghezza dovrebbero essere float (numeri decimali), e la funzione restituirà un float.

Proviamo a usarla:

area = calcola_area(5.5, 3.2)
print(f"L'area è: {area}")

Output:

L'area è: 17.6

Ricorda, queste annotazioni non impongono i tipi – potresti ancora chiamare calcola_area("ciao", "mondo"), ma non avrebbe molto senso!

Annotazioni delle Funzioni con Tipo di Ritorno

Abbiamo già visto l'annotazione -> float per il tipo di ritorno, ma guardiamo un esempio più complesso:

def ottieni_info_utente(user_id: int) -> dict:
# Immagina che questa funzione prenda i dati dell'utente da un database
return {
"id": user_id,
"name": "Alice",
"age": 30,
"email": "[email protected]"
}

utente = ottieni_info_utente(12345)
print(f"Nome utente: {utente['name']}")

Output:

Nome utente: Alice

Qui, stiamo indicando che la funzione prende un intero user_id e restituisce un dizionario.

Annotazioni delle Funzioni con Espressioni

Le annotazioni non devono essere solo tipi semplici – possono essere anche espressioni più complesse. Ecco un esempio:

from typing import List, Union

def processa_elementi(elementi: List[Union[int, str]]) -> List[str]:
return [str(elemento).upper() for elemento in elementi]

risultato = processa_elementi([1, "ciao", 42, "mondo"])
print(risultato)

Output:

['1', 'CIAO', '42', 'MONDO']

In questo esempio, List[Union[int, str]] significa che la funzione si aspetta una lista dove ogni elemento può essere sia un intero che una stringa.

Annotazioni delle Funzioni con Argomenti Predefiniti

Possiamo combinare annotazioni con argomenti predefiniti. Ecco come:

def saluta_utente(nome: str = "Ospite") -> str:
return f"Benvenuto, {nome}!"

print(saluta_utente())
print(saluta_utente("Alice"))

Output:

Benvenuto, Ospite!
Benvenuto, Alice!

In questa funzione, stiamo dicendo che nome dovrebbe essere una stringa, e se non viene fornito alcun nome, il valore predefinito è "Ospite".

Mettiamoci Tutti Insieme

Ora, guardiamo un esempio più complesso che combina varie tecniche di annotazione:

from typing import List, Dict, Union

def analizza_vendite(dati: List[Dict[str, Union[str, float]]]) -> Dict[str, float]:
vendite_totali = 0.0
articoli_venduti = 0

for transazione in dati:
vendite_totali += transazione['amount']
articoli_venduti += 1

return {
"vendite_totali": vendite_totali,
"vendita_media": vendite_totali / articoli_venduti if articoli_venduti > 0 else 0
}

dati_vendita = [
{"item": "Widget A", "amount": 10.99},
{"item": "Widget B", "amount": 5.99},
{"item": "Widget C", "amount": 15.99}
]

risultato = analizza_vendite(dati_vendita)
print(f"Vendite totali: ${risultato['vendite_totali']:.2f}")
print(f"Vendita media: ${risultato['vendita_media']:.2f}")

Output:

Vendite totali: $32.97
Vendita media: $10.99

Questo esempio mostra come possiamo utilizzare annotazioni complesse per descrivere la struttura dei nostri dati di input e il valore restituito.

Riepilogo dei Metodi di Annotazione delle Funzioni

Ecco una tabella che riassume i diversi modi in cui possiamo utilizzare le annotazioni delle funzioni:

Metodo Esempio Descrizione
Annotazione del Parametro def func(x: int): Suggerisce il tipo per un parametro
Annotazione del Tipo di Ritorno def func() -> str: Suggerisce il tipo di ritorno della funzione
Valore Predefinito con Annotazione def func(x: int = 0): Combina un suggerimento di tipo con un valore predefinito
Annotazione di Tipo Complesso def func(x: List[int]): Utilizza tipi dal modulo typing per suggerimenti di tipo più specifici
Tipi Multipli (Union) def func(x: Union[int, str]): Suggerisce che un parametro può essere uno dei vari tipi

Ricorda, queste annotazioni sono suggerimenti, non regole rigorose. Python non vi impedirà di utilizzare tipi diversi, ma strumenti come mypy possono utilizzare queste annotazioni per catturare errori potenziali prima di eseguire il vostro codice.

E ce l'abbiamo fatta, miei cari studenti! Abbiamo attraversato la terra delle Annotazioni delle Funzioni Python. Spero che questa guida abbia illuminato questo concetto per voi. Ricorda, il miglior modo per imparare è fare, quindi non esitare ad esperimentare con queste annotazioni nel tuo codice. Buon coding, e che le tue funzioni siano sempre ben annotate!

Credits: Image by storyset