Condicionals
Fins ara en Karel executava les ordres cegament, sense mirar el que tenia davant. En aquest capítol li ensenyem a prendre decisions: fer una cosa si es compleix una condició, i una altra cosa diferent si no es compleix. Aquesta és la capacitat que converteix un programa rígid en un programa intel·ligent.
En Karel ha de decidir
Fins ara, els programes d'en Karel eren llistes d'ordres fixes: move(), grab(), turn_left()... En Karel les executava sense mirar el que tenia davant.
Però imagina que el món pot tenir una perla en una casella o no. Si en Karel sempre fa grab() i resulta que no hi ha perla, el programa s'atura amb un error. Necessitem una manera de dir-li: «si hi ha una perla, agafa-la; si no n'hi ha, no facis res».
Això és exactament el que fa if.
Executar alguna cosa només si… if
if comprova una condició i executa el bloc indentat de sota només si la condició és certa. Si la condició és falsa, el bloc se salta i en Karel continua amb la línia següent.
if pearl_here():
grab()
En Karel comprova si hi ha una perla a la casella on és. Si n'hi ha, la recull. Si no n'hi ha, segueix al pròxim pas sense fer res i sense cap error.
Condicions disponibles (les que ja coneixes del capítol 2, ara les pots usar de debò):
pearl_here()— hi ha una perla a la casella actual?front_is_clear()— la casella del davant és lliure?front_is_blocked()— la casella del davant té un obstacle?bag_is_empty()— la motxilla no conté cap perla?bag_is_full()— la motxilla conté, com a mínim, una perla?
En Karel recorre una fila amb perles disperses
En Karel recorre cinc caselles. Algunes en tenen, de perles, d'altres no. A cada casella comprova si n'hi ha i, si és així, la recull. Si la casella és buida, simplement continua sense error:
Atenció: en aquest exemple no pots modificar el codi. Prem ▶ Executa i observa com funciona:
El for repeteix cinc vegades. Dins del for, hi ha un if que comprova la perla. Quan en Karel arriba a una casella buida, l'if és fals i grab() no s'executa. No hi ha cap error.
I si no… else
De vegades volem fer una cosa si la condició és certa i una altra cosa diferent si és falsa. Per a això usem else.
if front_is_clear():
move()
else:
turn_left()
En Karel comprova si té la via lliure davant seu. Si la té, avança. Si no la té (hi ha un obstacle o la paret del món), gira a l'esquerra. Amb else, sempre passa alguna cosa: mai no hi ha un camí sense sortida.
Regla important: el bloc de l'if i el bloc de l'else mai no s'executen tots dos alhora. O s'executa l'un, o s'executa l'altre.
En Karel navega al voltant d'un obstacle
En Karel es mou per una graella en la qual hi ha una roca que li bloca el pas. A cada pas del for, comprova si pot avançar: si pot, avança; si no pot, gira a l'esquerra i busca un camí alternatiu:
Atenció: en aquest exemple no pots modificar el codi. Prem ▶ Executa i observa com funciona:
En Karel avança dues caselles cap a l'Est, troba la roca i gira al Nord. Tot seguit, amb les iteracions que queden, avança cap amunt. El programa no s'atura ni dona error: l'else gestiona el cas inesperat de manera elegant.
Exercici
Pista: usa un
for i in range(5):. Dins del for, avança primer i llavors comprova amb if pearl_here(): si has de recollir la perla.