Definizione di funzioni
Esempio:
Codice sorgente
def fattoriale(n):
i = 1
tot = 1
while i <= n:
tot = tot * i
i = i+1
return tot
print("fattoriale di 4:", fattoriale(4))
Valori di ritorno
Una funzione può ritornare una tupla di variabili e quindi è poco rilevante il fatto che di norma i parametri ricevuti in input non siano alterabili.
Tecnicamente si dice che i parametri delle funzioni sono passati by assignment.
In pratica possono essere modificate solo quei tipi di dato che prevedono dei meccanismi di modifica, come le liste e i dizionari.
Esempio:
Codice sorgente
def rettangolo(base, altezza):
area = base * altezza
perimetro = (base + altezza) * 2
return (area, perimetro)
a, b = rettangolo(3, 4)
print("rettangolo(3, 4)\nArea:", a, "\nPerimetro:", b)
Esecuzione
rettangolo(3, 4)
Area: 12
Perimetro: 14
Note:
La funzione rettangolo restituisce la tupla di variabili (area, perimetro)
I valori di ritorno sono assegnati alla tupla (a, b)
Esempio:
Codice sorgente
def studenti(elenco, nominativo):
elenco += [nominativo]
x = ["Marco Lo Russo", "Anna Fioravanti", "Gennaro Esposito"]
studenti(x, "Antonio Izzo")
print(x)
Esecuzione
['Marco Lo Russo', 'Anna Fioravanti', 'Gennaro Esposito', 'Antonio Izzo']
Note:
La funzione studenti riceve tra i parametri una lista. Essa viene aggiornata all'interno della funzione. L'aggiornamento è visibile anche all'esterno della funzione.
Scope delle variabili (variabili globali e locali)
Nelle funzioni le variabili che sono referenziate senza essere assegnate sono considerate implicitamente globali.
La variabili dichiarate implicitamente globali non possono essere modificate.
Per evitare ambiguità e poter modificare una variabile globale è necessario dichiarare esplicitamente la variabile come globale tramite la parola chiave global (nel caso di funzioni innestate si può utilizzare anche la direttiva nonlocal al posto di global).
Esempio:
Codice sorgente
a = 10
b = 9
c = 8
def myscope1():
a = 11 # a è assegnata quindi è locale
c = b # b è referenziata quindi è globale ma non può essere modificata
# c è locale
def myscope2():
global b
a = 11 # a è assegnata quindi è locale
c = b # b è globale e può essere modificata. c è locale
b = 77
myscope1()
print("a:", a, "b:", b, "c:", c)
myscope2()
print("a:", a, "b:", b, "c:", c)
Esecuzione
a: 10 b: 9 c: 8
a: 10 b: 77 c: 8
Note:
Nella funzione myscope1() la variabile b è referenziata senza essere assegnata. E' considerata globale ma non può essere modificata. In caso di modifica è generata una eccezione e il programma termina.
Nella funzione myscope2() la variabile b è dichiarata globale in modo esplicito pertanto la variabile può essere modificata.
Documentazione di una funzione
Nel momento in cui si definisce una funzione è buona norma inserire una sintetica descrizione della funzione, che può essere successivamente consultata dal programmatore che intende utilizzarla.
Ad esempio è possibile stampare la documentazione della funzione input nel seguente modo:
Esempio:
Codice sorgente
print(input.__doc__)
Esecuzione
Read a string from standard input. The trailing newline is stripped.
The prompt string, if given, is printed to standard output without a trailing newline before reading input.
If the user hits EOF (*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise EOFError. On *nix systems, readline is used if available.
Note:
La stampa produce la documentazione della funzione input.
__doc__ è un attributo predefinito delle funzioni.
Esempio:
Codice sorgente
def fattoriale(n):
'''
Calcola il fattorial di n
'''
i = 1
tot = 1
while i <= n:
tot = tot * i
i = i+1
return tot
print(fattoriale.__doc__)
Esecuzione
Calcola il fattorial di n
Note:
La stringa di testo inserita inizialmente nella funzione costituisce la documentazione della funzione.
Una funzione è un oggetto
In Python le funzioni sono oggetti che sono creati al momento della definizione. Ad una funzione è anche associato un nome, che si comporta come tutte le altre variabili.
Esempio:
Codice sorgente
def rettangolo(base, altezza):
area = base * altezza
perimetro = (base + altezza) * 2
return (area, perimetro)
myfun = rettangolo
rettangolo = "sono una stringa"
a, b = myfun(3, 4)
print("myfun(3, 4)\nArea:", a, "\nPerimetro:", b)
print("La variabile rettangolo referenzia la stringa: ", rettangolo)
Esecuzione
myfun(3, 4)
Area: 12
Perimetro: 14
La variabile rettangolo referenzia la stringa: sono una stringa
Note:
In corrispondenza dell'istruzione def rettangolo è creato un oggetto (la funzione) ad è associato alla variabile rettangolo
Dopo l'assegnazione myfun = rettangolo la variabile myfun referenzia la funzione definita in precedenza
La variabile myfun può essere usata per invocare la funzione, in alternativa al nome originario
Dopo l'assegnazione rettangolo = "sono una stringa" la variabile rettangolo non referenzia più la funzione.
Python e le variabili statiche
In Python le variabili statiche, tipiche del linguaggio C, non sono implementate tuttavia esistono strumenti alternativi per risolvere tutte le problematiche.
Consideriamo ad esempio la seguente funzione in C in grado di portare il conteggio del numero di volte che è stata invocata.
Codice sorgente linguaggio C
#include <stdio.h>
void foo()
{
static int cont;
cont++;
printf("Invocazione N. %d\n", cont);
return;
}
int main()
{
for (int i=0; i<10; i++)
foo();
return 0;
}
Esecuzione programma C
Invocazione N. 1
Invocazione N. 2
Invocazione N. 3
Invocazione N. 4
Invocazione N. 5
Invocazione N. 6
Invocazione N. 7
Invocazione N. 8
Invocazione N. 9
Invocazione N. 10
Note:
La funzione foo() del programma C definisce la variabile cont di tipo static, pertanto la variabile ha memoria del valore assunto alla precedente invocazione. La variabile è automaticamente inizializzata a 0.
La versione Python dello stesso programma potrebbe essere la seguente
Codice sorgente in Python
def foo():
try:
foo.cont += 1
except Exception:
foo.cont = 1
print("Invocazione N.", foo.cont)
for i in range(10):
foo()
Esecuzione programma Python
Invocazione N. 1
Invocazione N. 2
Invocazione N. 3
Invocazione N. 4
Invocazione N. 5
Invocazione N. 6
Invocazione N. 7
Invocazione N. 8
Invocazione N. 9
Invocazione N. 10
Note:
Ad una funzione è possibile associare un attributo con una sintassi del tipo mia_funzione.mio_attributo = "attributo"
L'attributo "accompagna" l'oggetto e non il nome della funzione.
Sito: 7ecnologie
Sezione: 09. Python
Capitolo: 02. Introduzione a Python
Paragrafo: 10. Definizione di funzioni
Indice dei capitoli: 00. Risorse - 01. Ambiente di sviluppo - 02. Introduzione a Python - 03. Accesso al DB - 04. La libreria tkinter - 05. Tutorial - 98. Esercizi
Indice dei paragrafi: 01. Primi passi - 02. Funzioni input() e print() - 03. Liste - 04. Tuple - 05. Operatori e conversione di tipi - 06. Dizionari - 07. Insiemi - 08. Il ciclo for - 09. Gestione delle eccezioni - 10. Definizione di funzioni - 11. Parametri delle funzioni