Funcions
Quan la mateixa seqüència d'ordres apareix una i altra vegada, és el moment de donar-li un nom. En aquest capítol aprendrem def nom():, la instrucció que ens permet inventar ordres noves que en Karel entendrà igual que move() o grab().
Quan les mateixes ordres apareixen una i altra vegada
Imagina que en Karel ha d'escalar una escala de tres graons. Per pujar un graó, el procés és sempre el mateix: gira a l'esquerra, avança, gira a la dreta, avança. Quatre ordres per graó. Tres graons: dotze ordres. I si l'escala té deu graons?
Copiar les mateixes quatre línies una i altra vegada és el senyal que hi ha una idea que no té nom. Els programadors ho resolen donant-li un nom.
Primer, observa com es puja un sol graó. Quatre ordres:
Quatre ordres. En Karel ha pujat un graó. Ara imagina que has de repetir-ho per cada graó d'una escala llarga.
Inventar una ordre nova: def nom():
def (abreviació de define, «defínir») permet crear una ordre nova que en Karel reconeixerà igual que move() o turn_left(). La seva forma és:
def nom():
ordre1()
ordre2()
...
Primer escrius la definició (el «com es fa»). Llavors pots usar nom() al teu programa tantes vegades com vulguis.
El nom que tries hauria de descriure clarament el que fa la funció. puja_grao() és molt millor que cosa() o a().
Ara definim puja_grao() i escalem tres graons. Compara el codi d'aquí amb el que necessitaries sense def:
Set línies fan el mateix que dotze línies sense def. Però el guany principal no és la brevetat: és la llegibilitat. Quan llegeixes puja_grao(), saps exactament el que fa sense haver de desxifrar les quatre ordres de dins.
Les funcions es poden combinar
Una funció pot cridar altres funcions. Pots construir accions complexes a partir d'accions més simples, com passa a l'Arquitectura, on es construeix a partir d'estructures cada cop més complexes que es van combinant.
Per exemple, si vols que en Karel faci dues vegades la seqüència «puja un graó i recull una perla», pots definir:
def puja_i_recull():
puja_grao()
grab()
Això funciona sempre que puja_grao() ja estigui definit abans de ser cridat.
Regla important: les definicions def han d'anar sempre al principi del programa, abans de les ordres que les usen.
Exercici
puja_grao() i usa'l per arribar a la perla i recollir-la.
Pista: defineix puja_grao() amb quatre ordres. Llavors crida'l quatre vegades i afegeix un grab() al final.