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!
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?
- rendono il vostro codice più leggibile.
- aiutano altri sviluppatori (e il futuro voi!) a comprendere meglio il vostro codice.
- 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