Come disegnare mille quadrati diversi con un’unica funzione.
Abbiamo visto che se devo disegnare tanti quadrati, invece che ripetere tante volte i ciclo for è molto più sensato definire una funzione da richiamare tutte le volte ce mi serve usando semplicemente il suo nome.
Ora se ho definito la funzione quadrato, posso disegnare quanti quadrati voglio, in tutte le posizioni e in tutte le direzioni, ma saranno tutti quadrati congruenti. E se mi servissero quadrati grandi e quadrati piccoli? Vediamo come gli informatici hanno risolto questo problema.
Creiamo una nuova finestra di editor e salviamola con il nome xxquadrati.py (dove con xx intendo il numero di programmi a cui siete arrivati). Poi, nella sezione delle funzioni definiamo la funzione quadrato come abbiamo già fatto nel primo programma. Poi scriviamo il programma principale, quello che crea un foglio, crea una tartaruga e disegna un quadrato. Ricordiamoci anche di scrivere i commenti. Dovrebbe essere qualcosa di simile a questo:
# <data>
# <nome>
# Quadrati con la grafica della tartaruga: parametri
# lettura delle librerie
from pyturtle import TurtlePlane, Turtle
# Definizioni di funzioni
def quadrato():
"""Disegna un quadrato di lato 50."""
for cont in range(4):
tina.forward(50)
tina.left(90)
# Programma principale
foglio = TurtlePlane()
tina = Turtle()
quadrato()
Eseguiamo il programma (tasto <F5>) e correggiamo tutti gli errori finché non otteniamo il nostro quadrato. Ricordiamoci di disporre le finestre in modo da poter vedere contemporaneamente il codice che abbiamo scritto, il foglio su cui disegna la tartaruga e la finestra della shell su cui appaiono eventuali messaggi.
Nei prossimi programmi avremo bisogno di quadrati grandi e di quadrati piccoli. Non è un problema scrivere una funzione quadratino e una funzione quadratone, ad esempio:
def quadratino():
"""Disegna un quadrato di lato 10."""
for cont in range(4):
tina.forward(10)
tina.left(90)
def quadratone():
"""Disegna un quadrato di lato 100."""
for cont in range(4):
tina.forward(100)
tina.left(90)
Osservazione: tra due funzioni lasciate sempre una linea vuota, migliora la leggibilità del codice.
Modifichiamo anche il programma principale in modo che disegni tutti tre i quadrati. Proviamolo e correggiamo tutti gli errori.
Le due funzioni fanno il loro dovere, ma non siamo soddisfatti, ci resta un dubbio. Se avessi bisogno anche di un quadratino di lato 7 o di lato 9.2 o di lato ... dovrei riempire il mio programma di funzioni quasi del tutto uguali.
Mettiamo in evidenza in che cosa sono diverse le funzioni precedenti. L’unica cosa che cambia da una all’altra è un numero. Possiamo sostituire quel numero con un parametro, cioè una variabile che una volta valga 10 una volta 100 e quando mi serve un quadrato di lato 25.6 valga esattamente 25.6! Il parametro deve essere dichiarato all’interno delle parentesi che seguono il nome della funzione e deve avere un nome che sia significativo per noi, nel nostro caso un buon nome per il parametro può essere “lato”. Modifichiamo la funzione quadrato in questo modo:
def quadrato(lato):
"""Disegna un quadrato dato il lato."""
for cont in range(4):
tina.forward(lato)
tina.left(90)
La sintassi completa di una funzione è dunque:
def <nome>([<parametri>]):
<istruzioni>
Ora se tentiamo di eseguire la funzione quadrato con il comando:
>>> quadrato()}
Traceback (most recent call last):
File <pyshell>, line 1, in <module>
quadrato()
TypeError: quadrato() takes exactly 1 argument (0 given)
... invece della figura otteniamo un messaggio di errore. L’ultima riga ci dice quale difficoltà ha incontrato Python nel tentare di eseguire il nostro comando: la funzione quadrato() richiede esattamente un argomento, noi gliene abbiamo dati zero. Dobbiamo dire a quadrato quanto grande lo vogliamo:
>>> quadrato(25.6)
Questa volta appare il quadrato e con questa unica funzione possiamo disegnare quadrati di tutte le dimensioni. Il numero posto tra parentesi, che si chiama “argomento”, viene associato alla parola “lato”, che si chiama “parametro” e quando viene dato alla tartaruga il comando di andare avanti le viene detto di andare avanti esattamente di quella quantità associata al parametro.
Modifichiamo il programma principale in modo che disegni i tre quadrati chiamando solo la funzione quadrato con diversi argomenti.
Riassumendo
È possibile definire delle funzioni con alcuni valori variabili, il nome delle variabili vanno inseriti tra la coppia di parentesi che segue il nome della funzione. La sintassi per definire una funzione è:
def <nome>([<parametri>]):
<istruzioni>
I parametri sono zero o più nomi eventualmente separati da virgole.
Al momento dell’esecuzione si deve mettere tra le parentesi che seguono il nome della funzione tanti argomenti quanti sono i parametri:
<nome>([<argomenti>])
Gli argomenti sono zero o più oggetti eventualmente separati da virgole.