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
| Operador | Vol dir |
|---|---|
a and b | cert si a i b són certes totes dues |
a or b | cert si com a mínim una de les dues és certa |
not a | el 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
| Nom | Valor |
|---|
Terminal
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?