Un piccolo esempio: script # Script per calcolare il perimetro e l'area # di un rettangolo, dati i suoi lati side1=input('inserisci la lunghezza della base: ') side2=input("inserisci la lunghezza dell'altezza: ") per=2*side1+2*side2 area=side1*side2 print "Il perimetro e': ", per print "L'area e': ", area
Un piccolo esempio Ogni volta che si abbia bisogno di riutilizzare il codice che calcola area e perimetro del rettangolo si deve ricopiare tutta la sequenza istruzioni. Riscrivere le stesse istruzioni più volte: Spreco di tempo Facilità di errori di ricopiatura Se mi accorgo di un errore devo modificare le istruzioni ovunque le abbia utilizzate
Funzioni Una funzione è una sequenza di istruzioni Python identificata da un nome. Si differenzia da uno script in quanto il suo scopo principale è quello di produrre uno o più valori a partire da determinati dati di ingresso (cosa che stabilisce un'analogia con l'omonimo concetto della matematica), Sono utili per automatizzare dei blocchi di istruzioni che si devono eseguire ripetitivamente dal prompt dei comandi. Possono operare solo sui dati forniti come ingresso alla funzione e sulle variabili create all interno della funzione Qualsiasi variabile creata nella funzione, ad eccezione di quelle esplicitamente restituite, sono eliminate con il termine della funzione (località delle variabili)
Un piccolo esempio: funzione # Script che definisce una funzione # per calcolare il perimetro e l'area # di un rettangolo, dati i suoi lati def rett(base, altezza): per=2*base+2*altezza area=base*altezza res=[per,area] return res side1=input('inserisci la lunghezza della base: ') side2=input("inserisci la lunghezza dell'altezza: ") res=rett(side1,side2) print "Il perimetro e': ", res[0] print "L'area e': ", res[1]
Definizione di una funzione L istruzione def comunica all interprete che l istruzione che segue inizializza la definizione di una funzione, e che il blocco di istruzioni seguente sono parte della funzione. def rett(in1, in2,...): Seguono poi le istruzioni: sono istruzioni della funzione tutte quelle indentate. Esse possono agire solo su variabili create all interno della funzione parametri di ingresso in1, in2, In uscita viene resa disponibile solo la variabile restituita con return
Funzioni esempio: I commenti cominciano con # E parte di codice che non # Script che definisce una funzione # per calcolare il perimetro e l'area # di un rettangolo, dati i suoi lati def rett(base, altezza): per=2*base+2*altezza area=base*altezza res=[per,area] return res viene interpretato come istrizioni, e non è eseguito Argomenti di ingresso alla funzione. Sono gli unici dati presenti all esterno del codice della funzione utilizzabili e conosciuti anche all interno Nome identificativo della funzione Indica che si sta definendo una funzione Indica la fine della funzione Valori di uscita della funzione. Sono le uniche variabili definite all interno della funzione che saranno disponibili una volta terminata la funzione
Località delle variabili 1 a=10 b=15 e=25 def prova(a): print Nella funzione prova a =, a b=100+a d=2*a print Nella funzione prova b =, b print Nella funzione prova d =, d print Nella funzione prova e =, e return b+10 c=prova(a) print Fuori dalla funzione prova a =, a print Fuori dalla funzione prova b =, b print Fuori dalla funzione prova d =, d print Fuori dalla funzione prova e =, e
Località delle variabili 2 Nella funzione prova a = 10 Nella funzione prova b = 110 Nella funzione prova d = 20 Nella funzione prova e = 25 Fuori dalla funzione prova a = 10 Fuori dalla funzione prova b = 15 Fuori dalla funzione prova d = Traceback (most recent call last): File "C:/Programmi/Python25/prova", line 17, in <module> print "Nella funzione prova d = ", d NameError: name 'd' is not defined
Località delle variabili 3 a=10 b=15 e=25 Variabli globali: disponibili a tutte le funzioni Parametro della funzione: esso diventa una variabile locale. Il suo nome non ha nessuna relazione con eventuali altre variabili globali con lo stesso nome def prova(a): print Nella funzione prova a =, a b=100+a d=2*a print Nella funzione prova b =, b print Nella funzione prova d =, d print Nella funzione prova e =, e return b+10 c=prova(a) print Fuori dalla funzione prova a =, a print Fuori dalla funzione prova b =, b print Fuori dalla funzione prova d =, d print Fuori dalla funzione prova e =, e Variabli locali: compaiono a sinistra di una istruzione di assegnazione Variabile globale: è la stessa e che c è all esterno della funzione
Utilizzare una funzione ATTENZIONE! Definire una funzione non vuol dire automaticamente eseguirla!! Una funzione indica che il blocco di istruzioni seguenti sono identificate da un nome, e che quelle istruzioni per poter funzionare hanno bisogno di un certo numero di variabili (argomenti della funzione). Le istruzioni della funzione sono eseguite solo quando si richiama la funzione, scrivendo il suo nome come una istruzione.
Utilizzare una funzione a=10 def prova(var_in): return res Definisco una funzione di nome prova che necessità di un parametro di ingresso. La funzione termina quando l indentazione torna al livello del def. c=prova(a) Chiedo all interprete di eseguire la funzione prova che ho definito, dando al suo parametro di ingresso var_in il valore della variabile a
File con più funzioni In un file.py ci possono essere un numero arbitrario di funzioni definite. Una funzione può essere utilizzata (eseguite) solo dopo che sia stata definita! def prova(var_in): res = var_in*var_in return res def stampanome(var_in): print Ciao, var_in print prova(10) print stampanome( Andrea )
Utilizzare funzioni già scritte Una volta definite delle funzioni, è possibile utilizzarle nel workspace di Python oppure in uno script attraverso l operazione di importazione Questa operazione rende la definizione delle funzioni importate disponibili.
Importazione: modo 1 Come per il modulo matematico di Python, posso decidere di aver bisogno di tutte le funzioni definite in tale modulo, e di volerle tenere separate da eventuali altre funzioni. >>>import math In tale modo ogni oggetto (variabile o funzione) definita all interno del modulo math, può essere utilizzato: >>> print math.sin(0.5) >>> print math.pi E necessario dire esplicitamente all interprete che le variabili e le funzioni richieste sono all interno del modulo math tramite l operatore.
Importazione: modo 1 Se definisco una funzione od una variabile con lo stesso nome di una appartenente al modulo math, esse sono in effetti oggetti distinti. Le variabili e funzioni del modulo math sono protetti dalla scatola del modulo: >>> pi=3.14 >>> import math >>> print pi 3.14 >>> print math.pi 3.1415926535897931 >>>
Importazione: modo 1 Spazio di lavoro File test.py >>> import test >>> b=test.prova(10) >>> print b 100 def prova(var_in): res = var_in*var_in return res def stampanome(var_in): print Ciao, var_in
Importazione: modo 2 E possibile importare specifiche funzioni o variabili da un modulo, per poi utilizzarle senza dover indicare l appartenenza ad un modulo. >>>from math import pi >>>from math import sin In tale modo ogni oggetto importato puà essere utilizzato semplicemente richiamando il suo nome: >>> sin(0.5) 0.47942553860420301 >>> pi 3.1415926535897931
Importazione: modo 2 Se definisco una funzione od una variabile con lo stesso nome di una importata, sovrascrivo il suo valore. >>> from math import pi >>> print math.pi 3.1415926535897931 >>> pi=5 >>> pi 5
Importazione: modo 1 Spazio di lavoro File test.py >>> from test import prova >>> b=prova(10) >>> print b 100 def prova(var_in): res = var_in*var_in return res def stampanome(var_in): print Ciao, var_in
Fattoriale in Python File num.py def fattoriale(n): if(n<0): print "Il fattoriale di un numero negativo non e' definito" return -1 res=1 for i in range(1,n+1): res=res*i return res Spazio di lavoro >>> from num import fattoriale >>> fattoriale(4) 24
Fibonacci in Python File num.py # Funzione iterativa per il calcolo dei numeri di fibonacci def fibonacci(n): if(n<0): print "Il numero di Fibonacci di un numero negativo non e' definito" return -1 if(n<2): return n fib1=0 fib2=1 for i in range(2,n): fib=fib1+fib2 fib1=fib2 fib2=fib fib=fib1+fib2 return fib
Fibonacci in Python File num.py # Funzione iterativa per il calcolo del fattoriale def fattoriale(n): return res # Funzione iterativa per il calcolo dei numeri di fibonacci def fibonacci(n): if(n<0): print "Il numero di Fibonacci di un numero negativo non e' definito" return -1 if(n<2): return n fib1=0 fib2=1 for i in range(2,n): fib=fib1+fib2 fib1=fib2 fib2=fib fib=fib1+fib2 return fib
Fibonacci in Python Spazio di lavoro >>> from num import fibonacci >>> for i in range(10) print fibonacci(i) 0 1 1 2 3 5 8 13 21 34 >>>