Tiza Paso a paso
Practicar →

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.

Practicar este tema →8 ejercicios que te corrigen paso a paso · gratis, sin cuenta

La explicación

La forma

if nota >= 7:
    print("Aprobado")
elif nota >= 4:
    print("Recuperatorio")
else:
    print("Desaprobado")

Se evalúan en orden, y la primera corta

Esto es lo más importante del tema. Con 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:

if nota >= 4:
    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

if x > 0:                   if x > 0:
    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.

Un ejercicio resuelto, paso a paso

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:

def estado(nota):
    if nota >= 7:
        return "Aprobado"
    elif nota >= 4:
        return "Recuperatorio"
    else:
        return "Desaprobado"
Fijate que el segundo 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.

Y uno del nivel del parcial

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:

kg ≤ 1           → 500
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(2.5) = 3
math.ceil(3.0) = 3   (si es exacto, no sube)
math.ceil(1.0) = 1

La función:

import math

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(0.5)  → 500    primer tramo
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.

def envio_mal(kg):
    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 <= 1:  r = 500                   → r = 500
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

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

Los otros temas de la unidad 3

Estructuras de control

Ver todos los temas de Pensamiento Computacional