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 |
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.