Pensamiento Computacional · Unidad 3 — Estructuras de control
Decisiones: if, elif, else
Las condiciones se evalúan en orden y la primera que da True corta. Por eso el orden en que las escribís cambia el resultado.
La explicación
La forma
print("Aprobado")
elif nota >= 4:
print("Recuperatorio")
else:
print("Desaprobado")
- Dos puntos al final de cada línea de condición.
- La indentación decide qué pertenece a cada rama. No es estética: es la sintaxis.
elifyelseson opcionales; puede haber muchoselify un soloelse.
Se evalúan en orden, y la primera corta
nota = 9, la primera condición
(>= 7) da True, imprime "Aprobado" y las de abajo ni se miran. Aunque 9
también sea >= 4, ese elif nunca se evalúa.
El orden mal puesto rompe todo
Mirá qué pasa si se invierten las condiciones:
print("Recuperatorio") ← un 9 entra acá
elif nota >= 7:
print("Aprobado") ← inalcanzable
Con un 9, la primera da True y dice "Recuperatorio". La segunda rama no se puede alcanzar nunca: cualquier nota mayor o igual a 7 ya es mayor o igual a 4.
La regla: de la condición más exigente a la menos exigente. Y si una rama nunca se ejecuta por más que pruebes, sospechá del orden antes que de la condición.
if separados contra elif
print("A") print("A")
if x > 10: elif x > 10:
print("B") print("B")
Con x = 20: el de la izquierda imprime A y B (son dos preguntas
independientes); el de la derecha imprime sólo A (una sola decisión con ramas).
Anidar
Un if puede ir adentro de otro, pero conviene evitarlo cuando se puede combinar
con and: dos niveles ya cuestan de leer, tres son ilegibles.
Una función recibe una nota de 0 a 10 y devuelve "Aprobado" si es 7 o más, "Recuperatorio" entre 4 y 6, y "Desaprobado" si es menos de 4. ¿Por qué esta versión está mal? def estado(nota): if nota >= 4: return "Recuperatorio" elif nota >= 7: return "Aprobado" else: return "Desaprobado"
Probemos con nota = 9. La primera condición es 9 >= 4, que da True.
Devuelve "Recuperatorio" y termina.
El problema no es la condición, es el orden. La rama de "Aprobado" es
inalcanzable: para llegar al elif habría que fallar el
nota >= 4, o sea tener menos de 4 — y ahí tampoco puede ser mayor que 7.
La versión correcta va de lo más exigente a lo menos exigente:
if nota >= 7:
return "Aprobado"
elif nota >= 4:
return "Recuperatorio"
else:
return "Desaprobado"
elif no necesita decir
nota >= 4 and nota < 7. Si llegó hasta ahí es porque la primera dio False,
o sea que la nota ya es menor que 7. Esa información viene gratis con el elif, y
agregarla de más ensucia sin aportar.
El control: probá un valor de cada rama y, sobre todo, los bordes: 3, 4, 6, 7. Si alguna rama no se alcanza con ningún valor, está mal el orden.
El costo de un envío es: hasta 1 kg, $500; más de 1 y hasta 5 kg, $500 más $200 por cada kilo adicional empezado; más de 5 kg, $1500 fijo. Escribir la función y explicar qué pasa si se usan tres if sueltos en lugar de elif.
Los tramos, escritos como los va a leer el programa. Conviene anotarlos antes de programar, porque el enunciado está en castellano y hay que traducir cada borde:
1 < kg ≤ 5 → 500 + 200 · (kilos adicionales empezados)
kg > 5 → 1500
"Por cada kilo adicional empezado" es un redondeo hacia arriba. Con 3,5 kg hay 2,5 kg adicionales, y eso se cobra como 3. Eso es math.ceil:
math.ceil(3.0) = 3 (si es exacto, no sube)
math.ceil(1.0) = 1
La función:
def envio(kg):
if kg <= 1:
return 500
elif kg <= 5:
return 500 + 200 * math.ceil(kg - 1)
else:
return 1500
Por qué cada condición se escribe así. El segundo tramo solo pregunta kg <= 5, sin repetir kg > 1: si el programa llegó hasta el elif, es porque el if anterior dio falso, o sea que kg ya es mayor que 1. Esa es toda la gracia del elif.
Las pruebas, una por tramo y una por borde:
envio(1) → 500 el borde: "hasta 1 kg" lo incluye
envio(2) → 700 500 + 200·1
envio(3.5) → 1100 500 + 200·3 (2,5 redondeado a 3)
envio(5) → 1300 500 + 200·4, el otro borde
envio(7) → 1500 tercer tramo
Los dos bordes, 1 y 5, son los casos de prueba que importan. Ahí es donde un < puesto donde iba un <= cambia la respuesta, y es lo que el enunciado está evaluando.
Ahora la segunda parte: qué pasa con tres if sueltos.
r = None
if kg <= 1:
r = 500
if kg <= 5:
r = 500 + 200 * math.ceil(kg - 1)
if kg > 5:
r = 1500
return r
Con kg = 0,5 se ejecutan los dos primeros if, porque 0,5 es menor o igual que 1 y también menor o igual que 5. El segundo pisa al primero:
if kg <= 5: r = 500 + 200·ceil(-0.5) → r = 500 + 200·0 = 500
resultado: 500
En este caso particular el número termina dando bien por casualidad —ceil(-0.5) da 0 y el término se anula— y eso es lo peligroso: el programa está mal y no se nota. Con 0,2 kg daría ceil(-0.8) = 0, también 500; pero si el segundo tramo cobrara un fijo distinto, el error sería visible enseguida.
La lección es esa: con if sueltos, un valor puede entrar en varias ramas y gana la última; con elif, entra en exactamente una y gana la primera que se cumple. Los tramos de una tabla son mutuamente excluyentes por definición, así que van con elif.
Un control global que conviene hacer: la función tiene que ser creciente. 500, 500, 700, 1100, 1300, 1500: nunca baja ✓. Si al aumentar el peso el costo bajara, hay un tramo mal escrito.
Dónde se pierde el punto: usar round en vez de ceil. "Kilo empezado" es redondear hacia arriba siempre; round(2.5) en Python da 2, no 3, porque redondea al par más cercano.
Dónde se cae la mayoría
- Escribir las condiciones de la menos exigente a la más exigente, y dejar ramas inalcanzables.
- Olvidar los dos puntos, o indentar mal y que una línea quede afuera de la rama.
- Usar varios if sueltos cuando se quería una sola decisión con elif.
Hasta acá la explicación. La práctica es la otra mitad: 8 ejercicios de este tema, en cuatro niveles, que no te dicen sólo si está bien al final sino que te corrigen en cada paso y te explican por qué. Y uno para escribir el programa vos, que se prueba ejecutándolo en Python ahí mismo, en el navegador. Además trae una animación que muestra la idea en movimiento.
Practicar Decisiones: if, elif, else →Dónde entra este tema en el parcial
- Primer parcial — Trazar: for con range y for sobre un diccionario10 puntos · resuelto paso a paso
Los otros temas de la unidad 3
Estructuras de control