2.14. Definire le funzioni

Una funzione raccoglie un blocco di codice sotto un nome in modo da poterlo richiamare da più punti. Ovunque un calcolo, un’azione o un blocco di lavoro strutturato compaia più di una volta, una funzione lo trasforma in un’unica entità con un nome.

La parola chiave è def:

def greet(name):
    print("hello,", name)

greet("Alice")
greet("Bob")

Output:

hello, Alice
hello, Bob

La riga che inizia con def è la definizione: crea la funzione ma non ne esegue il corpo. È la chiamata greet("Alice") a eseguire il blocco indentato.

2.14.1. Parametri e argomenti

I nomi tra parentesi nella riga def sono i parametri: segnaposto per i valori che il chiamante fornirà. I valori effettivamente passati sono gli argomenti. Una funzione può accettare zero o più parametri:

def square(x):
    return x * x

def add(a, b):
    return a + b

def is_even(n):
    return n % 2 == 0

Una chiamata con un numero errato di argomenti solleva immediatamente TypeError.

2.14.2. return

Un’istruzione return termina immediatamente la funzione e restituisce un valore al chiamante:

def absolute(x):
    if x < 0:
        return -x
    return x

Una funzione che non raggiunge mai un return (o che ha un return nudo senza valore) restituisce None:

>>> def shout(text):
...     print(text.upper())
...
>>> result = shout("hi")
HI
>>> print(result)
None

Una funzione può avere più istruzioni return; vince la prima raggiunta e il resto del corpo viene saltato.

2.14.2.1. Restituire più valori

Python restituisce un solo oggetto per chiamata, ma quell’oggetto può essere una tuple, e il chiamante può spacchettarla sul momento:

def minmax(values):
    return (min(values), max(values))

lo, hi = minmax([3, 1, 4, 1, 5, 9])

Le parentesi attorno al valore restituito sono facoltative; return a, b e return (a, b) sono equivalenti.

2.14.3. Docstring

Una stringa letterale posta come prima istruzione del corpo di una funzione è una docstring. Viene memorizzata nell’oggetto funzione ed è ciò che help() visualizza:

def scale(value, factor):
    """Multiply ``value`` by ``factor`` and return the result."""
    return value * factor

L’IDE mostra le docstring nei tooltip quando il cursore passa sopra il nome della funzione, quindi anche un riepilogo di una sola riga ripaga l’impegno. Le stringhe con triple virgolette permettono alla docstring di estendersi su più righe quando servono maggiori dettagli.

2.14.4. Convenzioni di denominazione

I nomi delle funzioni usano lo snake_case: parole minuscole separate da trattini bassi. Il nome dovrebbe descrivere ciò che la funzione fa:

  • Bene: read_temperature, parse_header, is_valid.

  • Da evitare: do_stuff, handle1, temp_func.

Un trattino basso iniziale (_helper) contrassegna una funzione come interna al suo modulo. La convenzione è ampiamente rispettata, ma non viene imposta da Python.