I parametri

Abbiamo visto un modo per scrivere una porzione di codice e riutilizzarla in punti diversi del programma. Ma nelle situazioni concrete sorge spesso l’esigenza di eseguire una porzione di codice con qualche piccola variazione.

Ad esempio noi potremmo avere bisogno di disegnare quadrati grandi e piccoli.

Scrivamo un programma che disegni due quadrati, uno grande, “quadratone” e uno piccolo, “quadratino”.

# 6 giugno 2014
# Daniele Zambelli
# Programma che disegna quadrati di diverso lato

# lettura delle librerie
import pyturtle as pt      # legge la libreria 'pyturtle' chiandola 'pt'

# definizione delle funzioni
def quadratone():
    """Fa disegnare un quadratone a tina."""
    for cont in range(4):      # ripete 4 volte il blocco seguente
        tina.forward(100)      # va avanti di 100 passi
        tina.left(90)          # gira a sinistra di 90 gradi

def quadratino():
    """Fa disegnare un quadratino a tina."""
    for cont in range(4):      # ripete 4 volte il blocco seguente
        tina.forward(20)       # va avanti di 20 passi
        tina.left(90)          # gira a sinistra di 90 gradi

# programma principale
foglio = pt.TurtlePlane()      # crea un paese delle tartarughe
tina = pt.Turtle()             # crea una tartaruga
quadratone()                   # disegna un quadratone
quadratino()                   # disegna un quadratino

foglio.mainloop()              # rende attiva la finestra

Funziona, ma le due funzioni sono quasi uguali e questo contraddice il principio di pigrizia.

Osservate le funzioni e evidenziate le differenze: a parte il nome l’unica differenza è il numero che indica la lunghezza del lato del quadrato.

Gli informatici hanno inventato un meccanismo per far disegnare quadrati grandi o piccoli alla stessa funzione.

Al posto del numero che cambia scriviamo un nome:

def quadrato():
    """Fa disegnare un quadratone a tina."""
    for cont in range(4):      # ripete 4 volte il blocco seguente
        tina.forward(lato)     # va avanti di lato passi
        tina.left(90)          # gira a sinistra di 90 gradi

Ma non basta, la funzione deve sapere che ha bisogno di conoscere la lunghezza del lato. Il meccanismo usato dagli informatici è quello aggiungere dei parametri alla funzione, la sintassi è:

def <nome funzione>(<elenco dei parametri>):
    <istruzioni>

Nel nostro caso, aggiungiamo alla funzione quadrato il parametro lato:

def quadrato(lato):
    """Fa disegnare un quadratone a tina."""
    for cont in range(4):      # ripete 4 volte il blocco seguente
        tina.forward(lato)     # va avanti di lato passi
        tina.left(90)          # gira a sinistra di 90 gradi

Se ora chiamiamo la funzione quadrato come nei programmi precedenti otteniamo un errore che ci dice più o meno che quadrato ha un parametro e che deve essere chiamato passandogli un argomento, cioè un valore da associare al parametro.

La chiamata di questa funzione dovrà essere qualcosa di simile a:

quadrato(37)

La lunghezza del lato del quadrato viene così decisa non quando viene definita la funzione, ma quando viene chiamata. La funzione quadrato disegnerà quindi un numero enorme di quadrati diversi a seconda del valore dell’argomento passato alla funzione.

Il programma precedente diventa quindi:

# 6 giugno 2014
# Daniele Zambelli
# Programma che disegna quadrati di diverso lato

# lettura delle librerie
import pyturtle as pt      # legge la libreria 'pyturtle' chiandola 'pt'

# definizione delle funzioni
# Invece di cancellare le seguenti due funzioni, ormai inutili,
# le ho commentate così da tenere traccia dell'evoluzione
# del programma.
#
#def quadratone():
#    """Fa disegnare un quadratone a tina."""
#    for cont in range(4):      # ripete 4 volte il blocco seguente
#        tina.forward(100)      # va avanti di 100 passi
#        tina.left(90)          # gira a sinistra di 90 gradi
#
#def quadratino():
#    """Fa disegnare un quadratino a tina."""
#    for cont in range(4):      # ripete 4 volte il blocco seguente
#        tina.forward(20)       # va avanti di 20 passi
#        tina.left(90)          # gira a sinistra di 90 gradi

def quadrato(lato):
    """Fa disegnare a tina un quadrato dato il lato."""
    for cont in range(4):      # ripete 4 volte il blocco seguente
        tina.forward(lato)     # va avanti di 20 passi
        tina.left(90)          # gira a sinistra di 90 gradi

# programma principale
foglio = pt.TurtlePlane()      # crea un paese delle tartarughe
tina = pt.Turtle()             # crea una tartaruga
quadrato(100)                  # disegna un quadratone
quadrato(20)                   # disegna un quadratino

foglio.mainloop()              # rende attiva la finestra

Altri problemi

  1. Disegna tre quadrati diversi in tre posizioni dello schermo.
  2. Disegna 15 quadrati con lato da 10 a 150 uno dentro l’altro.
  3. Disegna una spirale di quadrati.
  4. Disegna una fila di quadrati. Ricordati di far tornare la tartaruga nella posizione iniziale.
  5. Disegna una “coda” di quadrati, cioè una fila di quadrati non disposti in linea retta.
  6. Scrivi le procedure che disegnano un triangolo e un quadrato con lato variabile. Confrontale. Scrivi la procedura che, dati numlati e lato, disegni un qualunque poligono regolare.
  7. Usa la procedura precedente per realizzare una composizione grafica a fantasia.