9 Altri parametri

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.

Tabella 2.1: Relazione lati - angolo

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