Parametri

Come generalizzare funzioni, come passare valori alle funzioni.

Le funzioni definite dal programmatore sono molto utili per dividere il programma in parti sufficientemente piccole. Ma hanno la possibilità di diventare molto più utili se al nome della funzione aggiungiamo dei parametri. I parametri sono delle variabili, dei nomi scritti tra le parentesi che seguono il nome della funzione. Ai parametri vengono associati degli oggetti quando la funzione stessa viene chiamata.

Riprendiamo il programma successioni. Salviamolo cambiandogli il nome (Menu: File - Save as), chiamiamolo successioni02.py. Aggiustiamo le righe di intestazione del programma (la data e il titolo). Modifichiamo ora la funzione triangolari aggiungendo tra le parentesi il nome di una variabile: “n”. Togliamo anche le prime tre righe in modo da avere:

def triangolari(n):
    triangolare=0
    for num in range(n):
        triangolare+=num
        print "%5s" % triangolare

Il codice ritorna ad essere essenziale e pulito. Proviamolo: <F5> e poi nella shell di IDLE:

>>> triangolari()
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in -toplevel-
    triangolari()
TypeError: triangolari() takes exactly 1 argument (0 given)

Il risultato non è proprio quello che ci aspettavamo! Il messaggio ci segnala che triangolari si aspetta di ricevere un argomento mentre non ne ha ricevuto neanche uno, ciò non gli va bene e Python protesta. In pratica, alla variabile n (parametro) che nella definizione della funzione è messa tra parentesi, non è stato associato nessun oggetto (argomento) e quindi triangolari non può andare avanti. Come dare un valore al parametro n? Al momento della chiamata della funzione, tra le parentesi possiamo inserire degli argomenti e questi verranno associati ai parametri.

>>> triangolari(5)
    0
    1
    3
    6
  10

I parametri ci permettono di scrivere procedure più flessibili che utilizzano variabili il cui valore viene definito al momento della chiamata della funzione stessa.

Affrontiamo un altro problema: proviamo a scrivere procedure che calcolino aree e perimetri delle figure piane studiate alle medie. Per iniziare voglio una procedura che, dati base e altezza di un triangolo, ne stampi l’area. Poiché i dati sono 2, avrà bisogno di 2 parametri, e dato che devono contenere la misura della base e la misura dell’altezza conviene chiamarle una “base” e l’altra “altezza” (ma no!). Nota: i nomi delle funzioni e delle variabili devono aver senso per noi, per il computer un nome o l’altro è lo stesso.

Dato che iniziamo un nuovo progetto, creiamo un nuovo file e intestiamolo con i soliti commenti, poi iniziamo a riempirlo con le funzioni necessarie. Ad esempio:

def areatriangoloBH(base, altezza):
    print "Area del triangolo"
    print "base = %s" % base
    print "altezza = %s" % altezza
    print "area = %s" % (base*altezza/2.)

Alcune osservazioni:

  1. Dato che ci sono più modi per calcolare l’area del triangolo, il nome della funzione contiene quelle due strane lettere: BH che indicano base e altezza.
  2. Nell’ultima linea della funzione bisogna prestare attenzione ad un paio di particolari.
    1. Pur essendoci un solo elemento da inserire nella stringa, le parentesi sono necessarie pena uno strano errore dovuto a questioni di precedenza degli operatori: “%” viene eseguito prima di “*”.
    2. dopo il 2 è necessario un punto, perché?

Un’altra “famosa” formula per calcolare l’area del triangolo è quella che parte dai 3 lati: la formula di Erone.

Per chi se l’è dimenticata ecco la famosa formula dove p è il semi perimetro e l1, l2, l3 sono i tre lati:

S = \sqrt {p (p - l1)(p - l2)(p - l3)}

Riassumendo

  • I parametri sono delle variabili di proprietà delle funzioni.
  • Ogni parametro ha un nome che viene deciso quando si definisce la funzione.
  • Il contenuto dei parametri si chiama argomento e viene deciso quando viene chiamata la funzione che li contiene.
  • I parametri permettono di scrivere funzioni che hanno comportamenti diversi, decisi al momento della chiamata.
  • Una funzione può chiamare un’altra funzione, che a sua volta può chiamarne un’altra, e così via.

Prova tu

  1. Modifica le funzioni copiate da successioni.py in modo che accettino un parametro e cancella quelle divenute superflue.
  2. Scrivi la funzione che calcola l’area del triangolo con la formula di Erone.
  3. Prova la precedente funzione finché non dà un errore, quali valori possono dare errore, perché?
  4. Scrivi le funzioni che calcolano i perimetri dei poligoni che conosci.
  5. Scrivi le funzioni che calcolano le aree dei quadrilateri notevoli.