Nuove operazioni

Come scrivere funzioni con un risultato.

Abbiamo scritto delle funzioni che calcolano e stampano il risultato di certe formule, ma i linguaggi di programmazione permettono anche di scrivere dei blocchi di codice che si comportano come delle operazioni cioè funzioni che danno un risultato. I linguaggi di programmazione permettono perciò di creare delle nuove operazioni. L’istruzione che permette di creare nuove operazioni è l’istruzione return. Questa istruzione ha due effetti: termina una funzione e restituisce un risultato a chi l’ha chiamata.

Vediamo un esempio, possiamo scrivere l’operazione che restituisce la media di due numeri. Iniziamo un nuovo programma, menu -File-New window, solite righe di commento, poi scriviamo la funzione:

def media(n1, n2):
    return (n1+n2)/2.

Solito <F5> e poi nella shell di IDLE:

>>> print media(12, 18)
15.0

Il fatto di usare delle funzioni che restituiscono un valore è importante in informatica, permette di separare la parte di calcolo da quella di input e output dei dati.

Riprendiamo il calcolo dell’area di un triangolo dati i tre lati, possiamo scrivere una funzione che calcoli la formula di Erone:

def erone(l1, l2, l3):
    p=(l1+l2+l3)/2.
    return (p*(p-l1)*(p-l2)*(p-l3))**0.5

Osservazioni:

  1. Nella formula p=(l1+l2+l3)/2. le parentesi e il punto dopo il 2 sono necessari, perché?
  2. Questa volta non ho utilizzato la libreria math per calcolare la radice quadrata, ma ho usato un trucco matematico: la radice quadrata di un numero è uguale a una potenza che ha per esponente il valore ½ o 0.5 che è equivalente.
  3. Nei fogli di calcolo e in altri linguaggi il simbolo della potenza è “^”, in Python è una coppia di asterischi “**”.

Ora la funzione areatriangoloABC diventa:

def areatriangoloABC(l1, l2, l3):
    """Calcolo dell'area con la formula di Erone."""
    # Immissione dati
    print "Area del triangolo"
    print "lato1 = %s" % l1
    print "lato2 = %s" % l2
    print "lato3 = %s" % l3
    # Calcolo
    area=erone(l1, l2, l3)
    # Visualizzazione risultati
    print "area = %s" % area

In questo modo abbiamo realizzato una separazione tra la funzione che realizza la comunicazione con l’utente e la funzione che realizza il calcolo. Questa separazione è molto importante nei programmi “seri”. Le funzioni permettono un tipo di programmazione molto sintetica e pulita. Ci sono linguaggi di programmazione che usano pesantemente questa tecnica, sono detti linguaggi funzionali. Python permette anche una programmazione di tipo funzionale.

Supponiamo di dover calcolare la media dell’area di due triangoli. La traduzione in Python diventa quasi letterale:

def mediatri(a1, a2, a3, b1, b2, b3):
  return media(erone(a1, a2, a3), erone(b1, b2, b3))

e nella shell di IDLE:

>>> print mediatri(3, 4, 5, 13, 14, 15)
45.0

Come funziona? mediatri riceve 6 numeri, i lati dei 2 triangoli, chiama la funzione media e le passa due valori i risultati di erone con i primi 3 lati e erone con gli altri 3. Le funzioni erone calcolano le due aree, la funzione media ne calcola la media e la funzione mediatri restituisce il risultato.

Python permette anche di costruire funzioni che danno più risultati. Questo può risultare utile in matematica, ad esempio il punto medio M di un segmento di estremi A=(xa, ya) e B=(xb, e yb) ha per coordinate xm=(xa+xb)/2. e ym=(ya+yb)/2.. In Python si può scrivere la funzione:

def puntomedio(xa, ya, xb, yb):
  return (xa+xb)/2., (ya+yb)/2.

e nella shell di IDLE:

>>> print puntomedio(2, 5, -6, 1)
(-2.0, 3.0)

Riassumendo

  • È possibile scrivere funzioni che restituiscono un risultato.
  • Una funzione termina quando non ci sono più istruzioni da eseguire o quando viene eseguita l’istruzione return.
  • Il comando che termina l’esecuzione di una funzione fornendo il risultato è return <espressione[,..]>.
  • Una funzione può restituire più di un risultato, in questo caso i risultati vanno elencati dopo l’istruzione return, separati da virgole.
  • Python permette una programmazione funzionale.

Prova tu

  1. Riscrivi il calcolo dell’area dei poligoni usando delle funzioni.
  2. Scrivi la funzione che calcola la media tra 3 numeri.
  3. Riscrivi la funzione puntomedio() in modo che usi la funzione media.
  4. Scrivi la funzione che restituisce coefficiente angolare e termine noto della retta passante per due punti.
  5. Scrivi la funzione che restituisce coefficiente angolare e termine noto dell’asse di un segmento.
  6. Scrivi la funzione che effettua la traslazione di un punto nel piano cartesiano.
  7. Scrivi le funzioni che effettuano il ribaltamento di un punto rispetto agli assi e all’origine.