Mentre
El for va molt bé quan saps exactament quantes vegades vols repetir una acció. Però, i si no ho saps? En aquest capítol aprendrem while, que és una repetició que continua mentre una condició sigui certa, i que acaba quan la condició ja no és certa.
Quan no saps quantes vegades has de repetir
Imagina que en Karel ha d'avançar fins a topar amb una paret. El món pot tenir tres caselles o pot tenir deu. Amb for hauríes d'escriure el nombre exacte: range(3) o range(10). Però si el programa no sap la mida del món, no pot triar el número correcte.
La pregunta correcta no és «quantes vegades?», sinó «fins quan?». I la resposta és: «mentre tingui el camí lliure davant meu, continua avançant».
Això és exactament el que expressa la funció while.
Repetir mentre es compleixi…
while comprova una condició i executa el bloc indentat de sota repetidament mentre la condició sigui certa. Cada vegada que acaba el bloc, torna a comprovar la condició. Quan la condició és falsa, la repetició s'atura i el programa continua.
Llegeix aquest exemple:
while front_is_clear():
move()
En Karel comprova si té la via lliure davant. Si és cert, avança. Torna a comprovar. Si és cert de nou, avança. I així fins que hi hagi un obstacle o la paret del món. En aquest cas, és a dir, quan no es compleix que té lliure davant seu, s'atura.
Compara l'efecte de les instruccions for i while:
# for: saps exactament quantes vegades
for i in range(5):
move()
# while: avances fins que el camí s'acabi
while front_is_clear():
move()
El for és com dir «fes-ho cinc vegades». El while és com dir «fes-ho fins que no puguis».
Atenció: en aquest exemple no pots modificar el codi. Prem ▶ Executa i observa com funciona:
En Karel ha avançat fins al final del passadís, sense que en el codi sapiguem quina és la llargada. Si el món hagués tingut vint caselles, aquest codi hauria funcionat igualment.
Qualsevol condició funciona amb while
Com en el cas de if, pots usar qualsevol de les condicions que ja coneixes dins d'un while:
while front_is_clear():— avança mentre el camí estigui lliure.while pearl_here():— continua mentre hi hagi perles a la casella.while not bag_is_empty():— continua mentre la motxilla tingui, com a mínim, una perla.
En l'exemple de sota, en Karel té tres perles a la motxilla i les ha de deixar caure una per una mentre camina cap a l'Est:
while i if junts
while i if es combinen molt bé. El while controla fins quan continua la iteració; l'if de dins decideix el que es fa a cada passada.
Observa un exemple clàssic: en Karel recorre un corredor de llargada desconeguda i recull totes les perles que troba pel camí. No sap quantes perles hi ha ni en quines caselles estan:
Atenció: en aquest exemple no pots modificar el codi. Prem ▶ Executa i observa com funciona:
El while assegura que en Karel avança fins a la paret, sigui on sigui. L'if de dins s'ocupa de les perles sense que el programa s'aturi si una casella és buida. Els dos junts fan quelcom que cap dels dos podria fer sol.
Exercici
Pista: usa un
while front_is_clear(): com a iteració principal. Dins d'aquesta iteració, comprova amb if pearl_here(): si cal recollir una perla i, si n'hi ha, la reculls amb grab(). Abans de tornar a començar la iteració, avances una casella fent move(). Ara hauràs arribat al final, quan surtis del while: fes mitja volta amb turn_around(). Llavors, ves tornant i a cada pas, si encara tens perles a la motxilla, fas un drop(). Per saber si tens perles, has de fer servir la pregunta bag_is_full().