Come costruire funzioni sempre più flessibili
Perché fermarsi alla dimensione dei poligoni? Una volta usati i parametri per disegnare quadrati grandi e piccoli, possiamo generalizzare il meccanismo. In un nuovo file di nome poli.py, scriviamo le due procedure per disegnare quadrati e triangoli di lato variabile...:
# <data>
# <nome>
# Poligoni regolari con la grafica della tartaruga: parametri
# lettura delle librerie
from pyturtle import TurtlePlane, Turtle
# Definizioni di funzioni
def triangolo(lato):
"""Disegna un triangolo dato il lato."""
for cont in range(3):
tina.forward(lato)
tina.left(120)
def quadrato(lato):
"""Disegna un quadrato dato il lato."""
for cont in range(4):
tina.forward(lato)
tina.left(90)
# Programma principale
foglio = TurtlePlane()
tina = Turtle()
triangolo(20)
quadrato(20)
Evidenziamo le differenze tra una funzione e l’altra ce ne sono due: il numero di lati, il quadrato ne ha 4 e il triangolo 3, e l’ampiezza dell’angolo esterno, 90 per il quadrato, 120 per il triangolo. Proviamo a cercare una relazione che leghi il numero di lati all’ampiezza dell’angolo esterno.
Aggiungiamo, nel programma precedente le funzioni che disegnino altri poligoni e completiamo la tabella relativa a numero di lati e angolo esterno.
numerolati |
angoloesterno |
prodotto |
2 |
? |
|
3 |
||
4 |
||
5 |
||
6 |
||
7 |
||
8 |
||
9 |
||
10 |
||
n |
Quando i lati aumentano gli angoli diminuiscono... il prodotto tra numero di lati e angolo è sempre lo stesso... L’ultima riga della tabella avrà il prodotto uguale a 360 e l’angolo esterno uguale a 360 / n.
Nelle funzioni precedenti al posto di 90, possiamo scrivere 360/4 e al posto di 120, 360/3:
# Definizioni di funzioni
def triangolo(lato):
"""Disegna un triangolo dato il lato."""
for cont in range(3):
tina.forward(lato)
tina.left(360 / 3)
def quadrato(lato):
"""Disegna un quadrato dato il lato."""
for cont in range(4):
tina.forward(lato)
tina.left(360 / 4)
Osservazione la divisione in Python 2.x se opera su due numeri interi dà come risultato un numero intero:
>>> print 10 / 3
3}
Se almeno uno dei due operandi è un numero in virgola mobile, il risultato sarà in virgola mobile:
>>> print(10. / 3)
3.33333333333
In Python 3.x la divisione tra due numeri interi dà sempre come risultato un numero in virgola mobile:
>>> print(10 / 3)
3.33333333333
Per fare in maniera che il programma si comporti allo stesso modo in Python 2.x e in Python 3.x modifichiamo il programma aggiungendo, all’inizio, la seguente istruzione:
from future import division
Riprendiamo ora le due funzioni triangolo(lato) e quadrato(lato), confrontandole possiamo osservare che l’unica differenza è un “3” in triangolo che diventa “4” in quadrato, è facile generalizzare la funzione, possiamo scrivere la funzione poligono con due parametri: “numlati” e “lunglato” e far disegnare a questa funzione poligoni regolari qualunque.
Ora il programma sarà:
# <data>
# <nome>
# Poligoni regolari con la grafica della tartaruga: parametri
# lettura delle librerie
from future import division
from pyturtle import TurtlePlane, Turtle
# Definizioni di funzioni
def triangolo(lato):
"""Disegna un triangolo dato il lato."""
for cont in range(3):
tina.forward(lato)
tina.left(120)
def quadrato(lato):
"""Disegna un quadrato dato il lato."""
for cont in range(4):
tina.forward(lato)
tina.left(90)
def poligono(numlati, lunglato):
"""Disegna un poligono regolare dati:
il numero di lati: numlati,
la loro lunghezza: lunglato."""
for cont in range(numlati):
tina.forward(lunglato)
tina.left(360 / numlati)
# Programma principale
foglio = TurtlePlane()
tina = Turtle()
poligono(3, 20)
poligono(4, 20)
Osservate che è stata aggiunta la lettura di una libreria, è stato cambiato anche il programma principale e ora le due funzioni quadrato(lato) e triangolo(lato) non sono più utilizzate.
Definendo la funzione poligono(numlati, lunglato) abbiamo insegnato a Python a riconoscere ed eseguire un nuovo comando che permette di disegnare qualunque poligono regolare.
Riassumendo
È possibile definire delle funzioni con più parametri. Aumentare il numero di parametri permette di rendere la funzione più flessibile, ma, in compenso, può rendere più difficile capire il suo comportamento. È importante scegliere, per i parametri, dei nomi significativi.
Quando si vuole eseguire una funzione, si deve porre all’interno delle parentesi che seguono il nome della funzione stessa, tanti argomenti quanti sono i parametri presenti nella definizione della funzione. Ad esempio, se la funzione ha 2 parametri avrà bisogno di 2 argomenti.