7.5 Definizioni di funzione

Una definizione di funzione definisce un oggetto funzione definito dall'utente (vedere la sezione 3.2):

funcdef  ::=  "def" funcname "(" [parameter_list] ")" ":" suite
parameter_list  ::=  (defparameter ",")*
    ("*" identifier [, "**" identifier]
    | "**" identifier | defparameter [","])
defparameter  ::=  parameter ["=" expression]
sublist  ::=  parameter ("," parameter)* [","]
parameter  ::=  identifier | "(" sublist ")"
funcname  ::=  identifier
Potete scaricare il file originale (in Inglese) come testo.

Una definizione di funzione è un'istruzione eseguibile. La sua esecuzione collega il nome della funzione nello spazio dei nomi locale corrente alla funzione oggetto (un wrapper attorno al codice eseguibile per la funzione). Questa funzione oggetto contiene un riferimento al corrente spazio dei nomi globale come lo spazio dei nomi globale che deve essere usato quando viene chiamata la funzione.

La definizione della funzione non esegue il corpo della funzione; questa viene eseguita solo quando viene chiamata la funzione.

Quando uno o più parametri di alto livello hanno la forma parameter = expression, si dice che la funzione ha ``i valori dei parametri predefiniti''. Per un parametro con un valore predefinito, l'argomento corrispondente può essere omesso dalla chiamata, in quel caso il parametro predefinito viene sostituito. Se il parametro ha un valore predefinito, tutti i parametri che seguono devono avere anche loro un valore predefinito -- questa è una restrizione sintattica che non viene espressa dalla grammatica.

I valori dei parametri predefiniti vengono valutati quando la definizione di funzione viene eseguita. Questo significa che l'espressione viene valutata una volta, quando la funzione viene definita e quindi il solito valore ``pre-calcolato'' viene usato per ogni chiamata. Questo è particolarmente importante per capire quando un parametro predefinito è un oggetto mutabile, come una lista o un dizionario: se la funzione modifica l'oggetto (per esempio aggiungendo un elemento ad una lista), il valore predefinito viene in effetti modificato. Questo è, generalmente, quello che intendevamo. Un modo per aggirare questo comportamento è usare None come valore predefinito e provarlo esplicitamente nel corpo della funzione, per esempio:

def whats_on_the_telly(penguin=None):
    if penguin is None:
        penguin = []
    penguin.append("property of the zoo")
    return penguin

Le semantiche delle funzioni di chiamata vengono descritte in modo più dettagliato nella sezione 5.3.4. Una funzione chiama sempre i valori assegnati a tutti i parametri menzionati nella lista dei parametri, insieme agli argomenti posizionali, dagli argomenti delle parole chiave. Se è presente la forma ``*identifier'', viene inizializzata come una tupla, ricevendo ogni parametro posizionale eccedente, predefinita come una tupla vuota. Se invece è presente la forma ``**identifier'', viene inizializzata come un nuovo dizionario che riceverà ogni argomento delle parole chiave in eccesso, predefinito come un nuovo dizionario vuoto.

È anche possibile creare funzioni anonime (funzioni non legate ad un nome), da usare immediatamente nelle espressioni. Queste usano le forme lambda, descritte nella sezione 5.11. Notare che la forma lambda è solo una scorciatoia per una definizione semplificata di una funzione; una funzione definita in un'istruzione ``def'' può essere fornita o assegnata ad un altro nome proprio come una funzione definita nella forma lambda. La forma ``def'' è attualmente la più potente da quando permette l'esecuzione di istruzioni multiple.

Nota per i programmatori: Le funzioni sono oggetti di classi primarie. Una forma ``def'' eseguita all'interno di una definizione di funzione, definisce una funzione locale che può essere restituita o fornita passata. Le variabili libere, usate nelle funzioni annidate, possono accedere alle variabili locali delle funzioni che contengono il def. Vedere la sezione 4.1 per i dettagli.

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.