# control de flux

Condicionals en Python

if, elif, else, l'operador ternari i try/except: com prendre decisions i gestionar errors sense aturar el programa.

if executar només si es compleix una condició

Sintaxi

if condició:
    # s'executa només si condició és certa

Exemple

nota = 7
if nota >= 5:
    print("Aprovat")

A Python el bloc es marca amb indentació, no amb claus. Si nota >= 5 és certa s'executa la línia indentada; si és falsa, es continua després sense fer res.

else l'alternativa

Exemple

nota = 3
if nota >= 5:
    print("Aprovat")
else:
    print("Suspès")

elif encadenar diverses condicions

Exemple

nota = 6
if nota >= 9:
    print("Excel·lent")
elif nota >= 7:
    print("Notable")
elif nota >= 5:
    print("Aprovat")
else:
    print("Suspès")

Es comproven en ordre. En el moment que una és certa, s'executa el seu bloc i ja no es comprova cap més condició de la cadena.

Operadors lògics: and or not

Per combinar diverses condicions en una de sola. A Python el resultat d'una comparació és sempre True o False.

Taula

OperadorVol dir
a and bcert si a i b són certes totes dues
a or bcert si com a mínim una de les dues és certa
not ael contrari d'a: si a és cert, not a és fals

Exemple

edat = 16
if edat >= 0 and edat <= 17:
    print("Ets menor d'edat")

Recorda que pots escriure la mateixa condició com una comparació encadenada: 0 <= edat <= 17.

Avaluació en curtcircuit

En a and b, si a ja és fals, b ni s'arriba a avaluar: el resultat ja no pot canviar. El mateix amb a or b quan a ja és cert. Això es pot aprofitar per evitar errors:

if b != 0 and a / b > 1:
    print("Es compleix")

Si b val 0, b != 0 ja és fals i a / b mai s'avalua: no hi ha ZeroDivisionError. Si escrivissis les dues condicions a l'inrevés (a / b > 1 and b != 0), el programa petaria quan b fos 0.

Un detall: and/or no sempre donen True o False

and i or en realitat retornen un dels dos operands, no necessàriament True/False: 0 or "res" val "res", i 5 and 10 val 10. Amb comparacions (a > 0) no es nota, perquè una comparació ja val True o False — però és bo saber-ho per quan et trobis aquest ús més endavant.

Operador ternari

Python no té ?: com C, però té una expressió condicional pròpia que fa el mateix.

Sintaxi

valor_si_certa if condició else valor_si_falsa

Exemple

a = 5
b = 8
max_valor = a if a > b else b
print(max_valor)

Es llegeix gairebé com en llenguatge natural: "a, si a és més gran que b; si no, b". Aquí a > b és fals, així que max_valor val 8.

try / except — gestionar errors sense aturar el programa

Algunes operacions poden fallar en temps d'execució (dividir per zero, convertir text que no és un número...). Sense res més, un error d'aquest tipus atura el programa. Amb try/except el pots capturar i continuar.

Sintaxi

try:
    # codi que podria fallar
except TipusDError:
    # què fer si falla exactament aquest error

Exemple

a = 10
b = 0
try:
    resultat = a / b
    print(resultat)
except ZeroDivisionError:
    print("No es pot dividir per zero")

Com b val 0, la línia a / b provoca un ZeroDivisionError. En aquest instant l'execució salta directament al bloc except que coincideix amb el tipus d'error (sense arribar a la línia print(resultat)), i el programa continua amb normalitat.

Mira quin camí pren el programa

Tria una variant i avança pas a pas per veure quina condició es compleix, quin bloc s'executa, i què passa quan hi ha un error.

Codi

Variables

NomValor

Terminal

Pas 1 / 1

Problemes per resoldre

Sense solució ni comprovació automàtica: escriu el programa, executa'l (python3 programa.py) i prova'l amb els exemples i amb valors límit. Amb variables, condicionals i l'entrada i sortida que ja coneixes en tens prou (no calen bucles). Les pistes són plegades perquè les obris només si les necessites.

1. Signe i paritat if / elif

Demana un enter. Escriu en una línia si és positiu, negatiu o zero, i a la línia següent si és parell o senar (el zero és parell).

Nombre: -7
negatiu
senar

Nombre: 0
zero
parell
Pistes

El signe té tres casos que s'exclouen entre ells: una cadena if / elif / else. La paritat és una segona decisió, independent de la primera.

A Python -7 % 2 val 1 (el residu té el signe del divisor), així que aquí funcionaria de les dues maneres. Tot i això, comprovar n % 2 == 0 és el més segur: a C, per exemple, -7 % 2 val -1.

2. Entre 1 i 5 operadors lògics

Demana un enter i digues si és un valor entre 1 i 5, els dos extrems inclosos. Prova-ho amb 0, 1, 5 i 6.

Nombre: 5
correcte

Nombre: 6
no és correcte
Pistes

Pots escriure les dues condicions amb and, o bé encadenar-les com en matemàtiques: 1 <= n <= 5.

Els extrems són la trampa: amb > i < l'1 i el 5 quedarien fora. Comprova sempre els valors límit.

3. Vocal o consonant operadors lògics

Demana una lletra. Escriu «vocal» si ho és, «consonant» si és una altra lletra, i «no és una lletra» si és qualsevol altre caràcter. Ha de funcionar tant amb majúscules com amb minúscules (sense accents).

Lletra: E
vocal

Lletra: x
consonant

Lletra: 7
no és una lletra
Pistes

Llegeix-la amb input() i passa-la a minúscula amb el mètode .lower(): lletra = input("Lletra: ").lower(). Així només hauràs de comparar amb minúscules.

Una lletra és qualsevol caràcter entre "a" i "z": "a" <= lletra <= "z" funciona amb cadenes d'un caràcter. Decideix primer si és una lletra i només després si és vocal, amb una cadena de or. Suposa que l'usuari escriu un sol caràcter.

4. Calculadora if / elif

Demana dos nombres decimals i un operador (+, -, * o /) i escriu l'operació amb el resultat, amb dos decimals. Si l'operador no és cap dels quatre, escriu «Operació desconeguda»; si es demana dividir entre zero, escriu «No es pot dividir per zero».

Primer nombre: 7
Operador (+ - * /): /
Segon nombre: 2
7.00 / 2.00 = 3.50

Primer nombre: 5
Operador (+ - * /): /
Segon nombre: 0
No es pot dividir per zero

Primer nombre: 5
Operador (+ - * /): %
Segon nombre: 2
Operació desconeguda
Pistes

Llegeix l'operador com a text i tria l'operació amb una cadena if op == "+": / elif op == "-": ... / else: (l'else final recull els operadors desconeguts).

A la branca de "/" pots comprovar b == 0 abans de dividir, o bé fer la divisió dins d'un try i capturar el ZeroDivisionError (a Python, 5.0 / 0 també el provoca).

5. Dies d'un mes if / elif

Demana un mes (1-12) i un any, i escriu quants dies té aquell mes. El febrer en té 29 als anys de traspàs i 28 als altres; si el mes no és entre 1 i 12, escriu «mes incorrecte». Un any és de traspàs si és divisible entre 4 però no entre 100, o bé si és divisible entre 400.

Mes: 2
Any: 2024
29 dies

Mes: 2
Any: 1900
28 dies

Mes: 11
Any: 2023
30 dies

Mes: 13
Any: 2023
mes incorrecte
Pistes

Els mesos de 31 dies (1, 3, 5, 7, 8, 10 i 12) donen la mateixa resposta: junta'ls en una sola condició amb or (elif mes == 1 or mes == 3 or ...). El mateix amb els de 30 dies.

El febrer és l'únic cas amb una decisió a dins. L'any de traspàs es comprova amb (a % 4 == 0 and a % 100 != 0) or a % 400 == 0. Prova'l amb 1900 (no), 2000 (sí) i 2024 (sí). Millor no anomenar la variable any: ja és el nom d'una funció de Python (per exemple, a o year).

6. Tipus de triangle if / elif

Demana els tres costats d'un triangle (nombres enters). Si no formen un triangle, escriu «no és un triangle». Si en formen un, escriu si és equilàter (tres costats iguals), isòsceles (exactament dos d'iguals) o escalè (tots diferents).

Costat 1: 3
Costat 2: 3
Costat 3: 5
isòsceles

Costat 1: 1
Costat 2: 2
Costat 3: 3
no és un triangle
Pistes

Tres costats formen un triangle quan cada costat és més petit que la suma dels altres dos (estrictament: 1, 2 i 3 no en fan cap), i tots han de ser positius. Comprova-ho primer i només classifica si és cert.

L'ordre de les comprovacions importa: un triangle equilàter també té dos costats iguals, així que comprova primer l'equilàter (a == b == c), després l'isòsceles (a == b or b == c or a == c), i el que sobri és escalè.

7. Màxim i mínim de tres nombres operador ternari

Demana tres enters i escriu el màxim i el mínim, sense fer servir cap if ni les funcions max() i min(): només l'operador ternari.

Nombre 1: 7
Nombre 2: 12
Nombre 3: 5
Màxim: 12
Mínim: 5
Pistes

El màxim de dos nombres és a if a > b else b. Per a tres, calcula primer el màxim de dos i compara aquest resultat amb el tercer. El mínim funciona igual.

Guarda els resultats intermedis en una variable en lloc d'escriure una expressió enorme amb ternaris dins de ternaris: costa molt de llegir.

8. Equació de segon grau if imbricats

Demana els coeficients a, b i c de l'equació ax² + bx + c = 0 (nombres decimals) i resol-la. Si a és 0 no és de segon grau: resol bx + c = 0 (i tracta el cas b = 0: si c també és 0 hi ha infinites solucions, i si no, no en té cap). Si a no és 0, mira el discriminant Δ = b² − 4ac: positiu, dues solucions; zero, una de sola; negatiu, cap de real.

a: 1
b: -3
c: 2
Dues solucions: x1 = 2.00, x2 = 1.00

a: 1
b: 1
c: 1
No té solucions reals

a: 0
b: 2
c: -4
Equació de primer grau: x = 2.00
Pistes

Pensa-ho com decisions en dos nivells: primer a == 0 o no, i dins de cada cas una altra decisió (sobre b a la branca d'a = 0, sobre el discriminant a l'altra). Un if dins d'un altre if és perfectament vàlid.

Calcula el discriminant una sola vegada, en una variable. Per a l'arrel quadrada pots fer servir math.sqrt(d) (amb import math) o bé d ** 0.5, que no necessita cap import.

Prova també els casos límit: 1, 2, 1 (discriminant 0), 0, 0, 5 i 0, 0, 0.

9. Un enter vàlid? try / except

Demana un enter. Si el text és un nombre enter, escriu si és parell o senar; si no ho és (per exemple «hola» o «3.5»), escriu un missatge d'error sense que el programa peti.

Escriu un enter: 42
42 és parell

Escriu un enter: hola
"hola" no és un nombre enter

Escriu un enter: 3.5
"3.5" no és un nombre enter
Pistes

int(text) provoca un ValueError quan el text no representa un enter (també amb "3.5"). Posa la conversió dins d'un try i captura l'error amb except ValueError:.

Si la conversió falla, l'execució salta directament al except i la resta del try no s'executa: per això pots posar el missatge de paritat just després de la conversió. Guarda el text original en una variable per poder-lo mostrar al missatge d'error.

Exercicis d'autoavaluació

Cada exercici es genera amb valors nous a l'atzar. Llegeix el codi, pensa quina serà la sortida per terminal i comprova-ho.

—

Quina serà la sortida per terminal d'aquest programa?