Condicionales en Python — ejercicios resueltos con películas, tramos de impuestos, contraseñas y el juego de adivinar el número (y el or que dejaba entrar a todo el mundo)

Mi primer intento del ejercicio de las películas tenía esta línea: if edad >= 13 or edad < 17:. La idea era «entre 13 y 16 años». La probé con mi edad, salió bien, y la di por buena. Días después se la enseñé a mi primo de 8 años para que jugara con ella, y el programa le dijo que podía ver una película para mayores de 13 sin problema. Un niño de 8 años es «menor de 17», y con un or eso basta. Esa línea está en el fragmento 2 de «¿Qué falla aquí?», para que la caces tú antes de que te la cace a ti.

Estos son los ejercicios de condicionales en Python con solución: cuatro ejercicios en tres niveles (básico, intermedio y desafío), tres fragmentos con fallos para predecir, las soluciones comentadas línea a línea y un chuletario para repasar antes del examen. Si aún no lo has hecho, mira antes la teoría de condicionales y la práctica con tres programas: aquí ya no te doy el código hecho.

Cómo usar este artículo

  1. Lee el enunciado y la salida esperada. Los datos van fijos en variables al principio del programa, para que tu salida tenga que coincidir con la del artículo. Cuando funcione, cambia las variables por input().
  2. Intenta resolverlo en VS Code sin mirar nada. Si llevas más de 10 minutos atascado, lee la pista.
  3. Antes de ver la solución, prueba tus límites: el valor exacto de cada umbral y el de justo debajo. Ahí es donde fallan los condicionales.
  4. Compara con la solución comentada y lee el «Por qué está hecho así»: a veces tu versión funciona y aun así hay algo que aprender de la otra.

Nivel básico

Ejercicio 1 — Sistema de calificación de películas

Escribe un programa que, a partir de la edad del usuario, la clasificación de una película y si va acompañado de un adulto, diga si puede verla. Las clasificaciones son:

ClasificaciónSignificadoEdad mínima sin adulto
GTodos los públicos0
PGMenores de 10 con un adulto10
PG-13No recomendada para menores de 13 años13
RNo recomendada para menores de 17 años17
NC-17Solo mayores de 18 años18

Reglas: si llega a la edad mínima, puede verla; si no llega pero va acompañado de un adulto, también puede, salvo en NC-17, que no admite excepciones. La clasificación puede venir en minúsculas ("r"). Si no es ninguna de las cinco, el programa lo dice. Con edad = 15, clasificacion = "r" y va_acompanado = False, la salida esperada es:

--- Resultado ---
Clasificación R: no recomendada para menores de 17 años
Tu edad: 15 años
Acceso: ✗ No puedes ver esta película sin un adulto

Primero convierte la clasificación a mayúsculas con .upper(). Después, una cadena if/elif que solo asigna edad_minima y descripcion. Para la decisión final necesitas un or («llega a la edad o va acompañado») con un and dentro («va acompañado y no es NC-17»).

Ejercicio 2 — Calculadora de impuestos por tramo de renta

Escribe un programa que, a partir del salario bruto anual, elija el tipo que le toca según estos tramos simplificados y lo aplique a todo el salario:

Salario bruto anualTipo
Hasta 12.450 €19 %
Hasta 20.200 €24 %
Hasta 35.200 €30 %
Hasta 60.000 €37 %
Más de 60.000 €45 %

Debe mostrar el salario bruto, el tipo aplicado, el impuesto, el salario neto anual y el neto al mes en 12 pagas, con dos decimales. Con salario = 28000.0, la salida esperada es:

--- Cálculo simplificado ---
Salario bruto: 28000.00 €
Tipo aplicado: 30 %
Impuesto: 8400.00 €
Salario neto: 19600.00 €
Neto al mes (12 pagas): 1633.33 €

El IRPF de verdad es progresivo: cada tipo se aplica solo a la parte del sueldo que cae en su tramo (los primeros 12.450 € al 19 %, lo siguiente al 24 %…), y además hay mínimos personales y cotizaciones. Aquí se aplica un único tipo a todo el salario para practicar la cadena de elif. No uses este programa para calcular tus impuestos.

Los tramos dicen «hasta», así que la comparación natural es <=. Y con <=, el orden es el contrario al de las notas: de menor a mayor umbral. Si pones primero salario <= 60000, un sueldo de 28.000 € entraría ahí.

Nivel intermedio

Ejercicio 3 — Validador de contraseña segura

Escribe un programa que analice una contraseña según cinco criterios, diga cuáles cumple y cuáles no, y le dé una puntuación de 0 a 5:

  • Al menos 8 caracteres → +1 punto.
  • Contiene mayúsculas → +1 punto.
  • Contiene minúsculas → +1 punto.
  • Contiene números → +1 punto.
  • Contiene algún carácter especial de !@#$%^&* → +1 punto.

Clasificación final: de 0 a 2 puntos, «Muy débil 🔓»; 3, «Débil 🔐»; 4, «Fuerte 🔒»; 5, «Muy fuerte 🔒». Con contrasena = "Python@2024", la salida esperada es:

--- Análisis de contraseña ---
✓ Longitud suficiente (11 caracteres)
✓ Contiene mayúsculas
✓ Contiene minúsculas
✓ Contiene números
✓ Contiene caracteres especiales
Puntuación: 5/5
Seguridad: Muy fuerte 🔒

any(c.isupper() for c in contrasena) responde «¿algún carácter es mayúscula?» (lo viste en la práctica con los dígitos). Piensa bien qué parte del programa son comprobaciones independientes y cuál es una clasificación con un único resultado: no se escriben igual.

Desafío final

Ejercicio 4 — Juego de adivinar el número

El clásico. El programa piensa un número entre 1 y 100 y el jugador intenta adivinarlo. Después de cada intento, el programa dice «Demasiado bajo», «Demasiado alto» o «¡Correcto!», y al final muestra cuántos intentos ha necesitado y una valoración: de 1 a 3, «Increíble 🏆»; de 4 a 6, «Muy bien 👏»; de 7 a 10, «Bien ✓»; más de 10, «Sigue practicando 💪».

Para que tu salida sea comparable, fija numero_secreto = 69 y guarda las jugadas en una lista, jugadas = [50, 75, 63, 69], en lugar de leerlas con input(). La salida esperada es:

=== ADIVINA EL NÚMERO ===
Estoy pensando en un número entre 1 y 100...
Intento 1: 50
→ Demasiado bajo
Intento 2: 75
→ Demasiado alto
Intento 3: 63
→ Demasiado bajo
Intento 4: 69
→ ¡Correcto! 🎉
--- Resultado ---
Adivinaste en 4 intentos
Valoración: Muy bien 👏

Necesitas repetir «pedir un número y compararlo» hasta acertar. Eso es un bucle while, que verás a fondo en el próximo tema; para este ejercicio basta con while not adivinado: y poner adivinado = True cuando acierte. La jugada que toca es jugadas[intentos] antes de sumar 1 a intentos. En tu versión final, import random y numero_secreto = random.randint(1, 100).

¿Qué falla aquí?

Tres fragmentos cortos, cada uno con un error típico. Antes de leer la explicación, predice qué imprime cada uno.

Fragmento 1: la nota que venía de input()

nota = "7"            # input() SIEMPRE devuelve texto, aunque teclees un número

if nota >= 5:
    print("Aprobado")

¿Imprime «Aprobado»? No llega a imprimir nada:

Traceback (most recent call last):
  File "texto.py", line 3, in <module>
    if nota >= 5:
       ^^^^^^^^^
TypeError: '>=' not supported between instances of 'str' and 'int'

nota vale "7", con comillas: es un texto, igual que todo lo que devuelve input(). Y Python no sabe si el texto "7" es mayor o igual que el número 5, así que se niega con un TypeError. Ojo: con == no habría error ("7" == 7 es simplemente False), lo cual es peor, porque fallaría en silencio.

Comparar directamente lo que devuelve input() con un número. Conviértelo antes con int() o float().

El arreglo es convertir el texto antes de comparar:

nota = "7"
nota = float(nota)    # convierte el texto en número antes de comparar

if nota >= 5:
    print("Aprobado")

Salida:

Aprobado

Lo normal es convertir en la misma línea en que lees: nota = float(input("Nota: ")). Así la variable ya nace siendo un número.

Fragmento 2: la franja de edad con or

edad = 8

# Queremos la franja de 13 a 16 años (pueden ver PG-13, todavía no R)
if edad >= 13 or edad < 17:
    print("Franja 13-16: puede ver PG-13")
else:
    print("Fuera de la franja 13-16")

Con un niño de 8 años, ¿qué imprime?

Franja 13-16: puede ver PG-13

Es el or de mi primo. edad >= 13 es False, pero edad < 17 es True (8 es menor que 17), y a un or le basta con una. De hecho, esa condición es verdadera para cualquier edad: todo número es mayor o igual que 13, o menor que 17, o las dos cosas.

Escribir un rango («entre 13 y 16») con or. Un rango es «mayor o igual que el mínimo y menor que el máximo»: lleva and.

El arreglo, con comparación encadenada:

edad = 8

if 13 <= edad < 17:             # las dos a la vez: 13 <= edad and edad < 17
    print("Franja 13-16: puede ver PG-13")
else:
    print("Fuera de la franja 13-16")

Salida:

Fuera de la franja 13-16

Para comprobar un rango, escribe primero el número pequeño, después la variable y después el grande: 13 <= edad < 17. Si lo lees en voz alta y suena a mates, está bien.

Fragmento 3: el else que se fue con otro if

Es una sesión para mayores de 18. Si la persona es mayor de edad, se mira si tiene entrada; si es menor, no puede entrar. Con edad = 15, ¿qué imprime?

edad = 15
tiene_entrada = True

# Sesión +18: el else debería ser el de "menor de edad"
if edad >= 18:
    if tiene_entrada:
        print("Puede entrar a la sesión")
    else:                       # ¿de qué if es este else?
        print("Menor de edad: no puede entrar")
print("Fin de la comprobación")

Salida real:

Fin de la comprobación

Ni «Menor de edad» ni nada: solo «Fin de la comprobación». El else está sangrado 4 espacios, a la altura de if tiene_entrada:, así que es el else de ese if interior, no del primero. Con edad = 15, edad >= 18 da False y Python se salta todo el bloque, else incluido. El dibujo enseña con qué if se empareja cada else en las dos versiones:

A qué if pertenece cada elseA la izquierda, el else está a 4 espacios y se empareja con if tiene_entrada; con edad 15 el primer if es False y no se imprime nada salvo Fin. A la derecha, el else a 0 espacios es del primer if.Fragmento 3: el else sangrado de másif edad >= 18:if tiene_entrada:print("Puede entrar…")else:print("Menor de edad…")print("Fin…")edad = 15 → False: se salta todo el bloqueSalida: Fin…Arreglo: el else bajo el primer ifif edad >= 18:if tiene_entrada:print("Puede entrar…")else:print("Le falta…")else:print("Menor de edad…")print("Fin…")Salida: Menor de edad… / Fin…
Un else se empareja con el if que está a su misma altura: 4 espacios lo unen al if interior; 0 espacios, al exterior.

Decidir a qué if pertenece un else por cómo «debería» funcionar. Python lo decide solo por la sangría: un else es del if que está a su misma altura.

El arreglo pone el else a la altura del primer if (y, ya puestos, le da su propio else al if interior):

edad = 15
tiene_entrada = True

if edad >= 18:
    if tiene_entrada:
        print("Puede entrar a la sesión")
    else:
        print("Le falta la entrada")
else:                           # a la altura del primer if: es SU else
    print("Menor de edad: no puede entrar")
print("Fin de la comprobación")

Salida:

Menor de edad: no puede entrar
Fin de la comprobación

Soluciones comentadas

Solución ejercicio 1

# Ejercicio 1 — ¿Puedo ver esta película?
edad = 15
clasificacion = "r"                       # tal como la escribiría el usuario
va_acompanado = False

clasificacion = clasificacion.upper()     # "r" → "R": así solo comparamos mayúsculas

# 1. Edad mínima y descripción de cada clasificación
if clasificacion == "G":
    edad_minima = 0
    descripcion = "todos los públicos"
elif clasificacion == "PG":
    edad_minima = 10
    descripcion = "menores de 10 con un adulto"
elif clasificacion == "PG-13":
    edad_minima = 13
    descripcion = "no recomendada para menores de 13 años"
elif clasificacion == "R":
    edad_minima = 17
    descripcion = "no recomendada para menores de 17 años"
elif clasificacion == "NC-17":
    edad_minima = 18
    descripcion = "solo mayores de 18 años"
else:
    edad_minima = -1                      # marca de "clasificación desconocida"
    descripcion = ""

print("--- Resultado ---")
if edad_minima == -1:
    print(f"Clasificación {clasificacion} no reconocida")
else:
    print(f"Clasificación {clasificacion}: {descripcion}")
    print(f"Tu edad: {edad} años")
    # 2. Entra si llega a la edad O si va con un adulto (salvo NC-17, sin excepciones)
    if edad >= edad_minima or (va_acompanado and clasificacion != "NC-17"):
        print("Acceso: ✓ Puedes ver esta película")
    else:
        print("Acceso: ✗ No puedes ver esta película sin un adulto")

Salida:

--- Resultado ---
Clasificación R: no recomendada para menores de 17 años
Tu edad: 15 años
Acceso: ✗ No puedes ver esta película sin un adulto

Por qué está hecho así:

  • .upper() antes de comparar. Así basta con comparar con "R" y no con "R" y "r". Sin él, "r" == "R" es False y el programa diría «Clasificación r no reconocida».
  • La cadena solo asigna. Es el patrón de FP1: primero se decide edad_minima y descripcion; después, una sola decisión de acceso que vale para todas las clasificaciones. Si pusieras un print de acceso en cada rama, tendrías la misma condición repetida cinco veces.
  • -1 como marca de «desconocida». Ninguna edad mínima real es negativa, así que -1 no se puede confundir con una clasificación válida y la variable existe en todas las ramas (sin el else, usar edad_minima después daría NameError con una clasificación rara).

La línea clave, con zoom:

if edad >= edad_minima or (va_acompanado and clasificacion != "NC-17"):
ParteCon edad 15, R, sin adultoValor
edad >= edad_minima15 >= 17False
va_acompanadoFalseFalse
va_acompanado and clasificacion != "NC-17"False and … (no mira lo demás)False
False or False—False → entra en el else

Los paréntesis no son decoración: agrupan la excepción del adulto. Sin ellos funcionaría igual (Python evalúa and antes que or), pero con ellos se lee la regla tal como la dice el enunciado.

Solución ejercicio 2

# Ejercicio 2 — Impuesto por tramos (versión simplificada)
salario = 28000.0

# Con <= los tramos van de MENOR a MAYOR: el primero que se cumple es el bueno
if salario <= 12450:
    tipo = 19
elif salario <= 20200:            # aquí ya sabemos que salario > 12450
    tipo = 24
elif salario <= 35200:
    tipo = 30
elif salario <= 60000:
    tipo = 37
else:
    tipo = 45

impuesto = salario * tipo / 100
neto = salario - impuesto
mensual = neto / 12

print("--- Cálculo simplificado ---")
print(f"Salario bruto: {salario:.2f} €")
print(f"Tipo aplicado: {tipo} %")
print(f"Impuesto: {impuesto:.2f} €")
print(f"Salario neto: {neto:.2f} €")
print(f"Neto al mes (12 pagas): {mensual:.2f} €")

Salida:

--- Cálculo simplificado ---
Salario bruto: 28000.00 €
Tipo aplicado: 30 %
Impuesto: 8400.00 €
Salario neto: 19600.00 €
Neto al mes (12 pagas): 1633.33 €

Por qué está hecho así:

  • <= y de menor a mayor. 28000 <= 12450 es False; 28000 <= 20200 es False; 28000 <= 35200 es True → 30 %. Al llegar a cada elif ya sabemos que el salario supera el tramo anterior, así que no hace falta escribir salario > 12450 and salario <= 20200.
  • El else recoge «más de 60.000». No hace falta escribir salario > 60000: si todas las anteriores fallaron, lo es.
  • Las cuentas a mano: 28000 × 30 / 100 = 8400; 28000 − 8400 = 19600; 19600 / 12 = 1633.333…, que con :.2f se imprime 1633.33.
ComparaciónResultado¿Qué hace?
28000 <= 12450FalseSiguiente
28000 <= 20200FalseSiguiente
28000 <= 35200Truetipo = 30 y sale de la cadena
28000 <= 60000No se evalúa—

Copiar el orden de las notas (de mayor a menor) cuando usas <=. Si salario <= 60000 va primero, todos los sueldos de hasta 60.000 € pagarían un 37 %.

Solución ejercicio 3

# Ejercicio 3 — Validador de contraseña segura
contrasena = "Python@2024"
especiales = "!@#$%^&*"
puntos = 0

print("--- Análisis de contraseña ---")

# Cinco if INDEPENDIENTES: cada criterio suma por su cuenta (con elif solo contaría uno)
if len(contrasena) >= 8:
    print(f"✓ Longitud suficiente ({len(contrasena)} caracteres)")
    puntos += 1
else:
    print(f"✗ Demasiado corta ({len(contrasena)} caracteres, mínimo 8)")

if any(c.isupper() for c in contrasena):        # ¿alguna letra mayúscula?
    print("✓ Contiene mayúsculas")
    puntos += 1
else:
    print("✗ Sin mayúsculas")

if any(c.islower() for c in contrasena):
    print("✓ Contiene minúsculas")
    puntos += 1
else:
    print("✗ Sin minúsculas")

if any(c.isdigit() for c in contrasena):
    print("✓ Contiene números")
    puntos += 1
else:
    print("✗ Sin números")

if any(c in especiales for c in contrasena):     # ¿algún carácter de la lista?
    print("✓ Contiene caracteres especiales")
    puntos += 1
else:
    print("✗ Sin caracteres especiales")

# Ahora sí, una cadena: la puntuación cae en UNA sola categoría
if puntos <= 2:
    seguridad = "Muy débil 🔓"
elif puntos == 3:
    seguridad = "Débil 🔐"
elif puntos == 4:
    seguridad = "Fuerte 🔒"
else:
    seguridad = "Muy fuerte 🔒"

print(f"Puntuación: {puntos}/5")
print(f"Seguridad: {seguridad}")

Salida:

--- Análisis de contraseña ---
✓ Longitud suficiente (11 caracteres)
✓ Contiene mayúsculas
✓ Contiene minúsculas
✓ Contiene números
✓ Contiene caracteres especiales
Puntuación: 5/5
Seguridad: Muy fuerte 🔒

Por qué está hecho así:

  • Cinco if independientes para los criterios. Una contraseña puede cumplir varios a la vez, y cada uno suma su punto. Con una cadena elif, en cuanto se cumpliera el primero (la longitud) el resto ni se miraría y "Python@2024" sacaría 1 punto.
  • Una cadena elif para la clasificación. Aquí sí: la puntuación cae en una sola categoría. puntos <= 2 va primero para recoger 0, 1 y 2 de una vez.
  • len() dentro del mensaje. "Python@2024" tiene 11 caracteres: P-y-t-h-o-n (6), @ (1) y 2-0-2-4 (4). El programa lo cuenta por ti en lugar de escribir el número a mano.
CriterioComprobación¿Cumple?puntos después
Longitud11 >= 8✓1
Mayúsculasla P✓2
Minúsculasy, t, h…✓3
Números2, 0, 2, 4✓4
Especialesla @ está en "!@#$%^&*"✓5

Solución ejercicio 4

# Ejercicio 4 — Adivina el número
# En tu versión:  import random  y  numero_secreto = random.randint(1, 100)
numero_secreto = 69                 # fijo aquí para que la salida sea siempre la misma
jugadas = [50, 75, 63, 69]          # lo que teclearía el jugador (en tu versión, input())

intentos = 0
adivinado = False

print("=== ADIVINA EL NÚMERO ===")
print("Estoy pensando en un número entre 1 y 100...")

while not adivinado:                # repite mientras no acierte (bucles: próximo tema)
    intento = jugadas[intentos]     # la jugada que toca
    intentos += 1
    print(f"Intento {intentos}: {intento}")
    if intento < numero_secreto:
        print("→ Demasiado bajo")
    elif intento > numero_secreto:
        print("→ Demasiado alto")
    else:                           # ni menor ni mayor: igual
        print("→ ¡Correcto! 🎉")
        adivinado = True

print("--- Resultado ---")
print(f"Adivinaste en {intentos} intentos")
if intentos <= 3:
    valoracion = "Increíble 🏆"
elif intentos <= 6:                 # 4, 5 o 6: el elif ya sabe que es mayor que 3
    valoracion = "Muy bien 👏"
elif intentos <= 10:
    valoracion = "Bien ✓"
else:
    valoracion = "Sigue practicando 💪"
print(f"Valoración: {valoracion}")

Salida:

=== ADIVINA EL NÚMERO ===
Estoy pensando en un número entre 1 y 100...
Intento 1: 50
→ Demasiado bajo
Intento 2: 75
→ Demasiado alto
Intento 3: 63
→ Demasiado bajo
Intento 4: 69
→ ¡Correcto! 🎉
--- Resultado ---
Adivinaste en 4 intentos
Valoración: Muy bien 👏

Por qué está hecho así:

  • Un if/elif/else de tres caminos dentro del bucle. Cada intento es menor, mayor o igual que el secreto: tres casos excluyentes, así que es una cadena. El else no necesita escribir intento == numero_secreto: si no es menor ni mayor, es igual.
  • jugadas[intentos] antes de intentos += 1. En la primera vuelta intentos vale 0, y jugadas[0] es la primera jugada. Si sumaras antes, empezarías por jugadas[1] y te saltarías el 50.
  • La valoración con <= en orden creciente. «De 4 a 6» no necesita intentos >= 4 and intentos <= 6: si llega a elif intentos <= 6, ya sabemos que no es <= 3.

El corazón del programa, con zoom:

while not adivinado:                # repite mientras no acierte (bucles: próximo tema)
    intento = jugadas[intentos]     # la jugada que toca
    intentos += 1
    print(f"Intento {intentos}: {intento}")
    if intento < numero_secreto:
        print("→ Demasiado bajo")
    elif intento > numero_secreto:
        print("→ Demasiado alto")
    else:                           # ni menor ni mayor: igual
        print("→ ¡Correcto! 🎉")
        adivinado = True

Vuelta a vuelta:

Vueltajugadas[intentos]intentos despuésComparación que aciertaMensajeadivinado
1jugadas[0] = 50150 < 69Demasiado bajoFalse
2jugadas[1] = 75275 > 69Demasiado altoFalse
3jugadas[2] = 63363 < 69Demasiado bajoFalse
4jugadas[3] = 694ninguna → else¡Correcto!True → sale

Después del bucle, 4 <= 3 es False y 4 <= 6 es True: «Muy bien 👏». El dibujo enseña lo que hace cada pista: recortar el rango de números posibles hasta dejar solo uno.

Cómo se estrecha el rango en Adivina el númeroCuatro filas, una por intento: 50 es bajo y quedan 51 a 100; 75 es alto y quedan 51 a 74; 63 es bajo y quedan 64 a 74; 69 es correcto.50demasiado bajoquedan 51-10075demasiado altoquedan 51-7463demasiado bajoquedan 64-7469¡correcto!691255075100
Cada pista del if/elif/else descarta un trozo de la recta: con cuatro jugadas el rango pasa de 100 números a uno solo.

La estrategia de las jugadas de ejemplo (empezar en 50 y partir el rango por la mitad) se llama búsqueda binaria. Con ella nunca necesitas más de 7 intentos para un número del 1 al 100, porque cada pista descarta la mitad.


Cuestionario tipo examen

Ahora ponte a prueba como en el examen. Los cuestionarios de FP1 son así: 15 preguntas en 20 minutos (16 en 30 en el de Secuencias), casi todas de respuesta única (cada fallo resta un tercio de lo que vale la pregunta) y muchas de «¿qué imprime este código?», con algún hueco, relacionar o verdadero o falso. Aquí tienes 13 preguntas originales sobre condicionales. Contesta sin ejecutar nada, pulsa Comprobar y lee la explicación de cada una. Estas preguntas son también el banco del simulacro de teoría de FP1, que las mezclará con las de los demás temas.

Pregunta 1Respuesta corta

¿Qué imprime este programa? Escribe la salida exacta.

nota = 6.5
if nota >= 9:
    print("Sobresaliente")
elif nota >= 7:
    print("Notable")
elif nota >= 5:
    print("Aprobado")
else:
    print("Suspenso")
Solución

Respuesta: Aprobado

Las condiciones se miran de arriba abajo y se ejecuta solo la primera que se cumple. 6.5 no llega a 9 ni a 7, pero sí a 5: Aprobado.

Pregunta 2Única

¿Cómo sabe Python qué instrucciones están dentro de un if?

  1. Por la sangría (los espacios al principio de la línea)
  2. Por las llaves { }
  3. Por la palabra end al final
  4. Por los paréntesis de la condición
Solución

Respuesta: Por la sangría (los espacios al principio de la línea)

En Python la sangría es parte de la sintaxis: los dos puntos : abren el bloque y todo lo que tiene más sangría le pertenece. Si mezclas sangrías, salta IndentationError.

Pregunta 3Respuesta corta

¿Qué imprime este programa? Escribe la salida exacta.

x = 15
c = 0
if x > 10:
    c = c + 1
if x > 12:
    c = c + 1
if x > 20:
    c = c + 1
print(c)
Solución

Respuesta: 2

Aquí son tres if independientes (no elif), así que se comprueban los tres: 15 > 10 sí, 15 > 12 sí, 15 > 20 no. c acaba valiendo 2. Con elif solo habría sumado una vez.

Pregunta 4Única

¿Qué imprime este código?

edad = 17
if edad >= 18:
    print("Puede votar")
print("Fin")
  1. Solo Fin
  2. Puede votar y Fin
  3. Nada
  4. Un error
Solución

Respuesta: Solo Fin

La sangría manda: print("Fin") está al mismo nivel que el if, así que no depende de la condición. Como 17 ≥ 18 es falso, solo sale Fin.

Pregunta 5Única

¿Cuál es la forma correcta de comprobar que n está entre 1 y 10 (ambos incluidos)?

  1. 1 <= n <= 10
  2. 1 <= n or n <= 10
  3. n >= 1 and <= 10
  4. n in 1..10
Solución

Respuesta: 1 <= n <= 10

1 <= n <= 10 equivale a 1 <= n and n <= 10. Con or el rango no sirve: todo número es ≥ 1 o ≤ 10.

Pregunta 6Verdadero o falso

Sobre if, elif y else:

  1. Un if puede ir sin else.
  2. Un else puede llevar su propia condición: else x > 3:.
  3. Puede haber tantos elif como hagan falta.
  4. Si se cumplen varias condiciones de una cadena if/elif, se ejecutan todos esos bloques.
Solución
  • V — Un if puede ir sin else.
  • F — Un else puede llevar su propia condición: else x > 3:.
  • V — Puede haber tantos elif como hagan falta.
  • F — Si se cumplen varias condiciones de una cadena if/elif, se ejecutan todos esos bloques.

else no lleva condición: es «en cualquier otro caso». En una cadena if/elif/else se ejecuta un único bloque, el de la primera condición verdadera.

Pregunta 7Única

¿Qué imprime este código?

t = ""
if t:
    print("con texto")
else:
    print("vacío")
  1. vacío
  2. con texto
  3. Un error, porque t no es booleano
  4. Nada
Solución

Respuesta: vacío

En un if, cuentan como falsos el 0, el 0.0, el texto vacío '', la lista vacía [] y None. Todo lo demás es verdadero. Por eso if t: significa «si t tiene algo».

Pregunta 8Respuesta corta

¿Qué imprime este programa? Escribe la salida exacta.

a, b = 4, 9
if a > b:
    m = a
else:
    m = b
if m % 2 == 0:
    print(m // 2)
else:
    print(m * 2)
Solución

Respuesta: 18

El primer if se queda con el mayor: m = 9. Como 9 es impar (9 % 2 = 1), va al else: 9 × 2 = 18.

Pregunta 9Rellenar huecos

Completa para que diga si un número es positivo, negativo o cero:

if n > 0: imprime «positivo»; ____ n < 0: imprime «negativo»; ____: imprime «cero».

Palabras:

  • elif
  • if
  • while
  • else
Solución

if n > 0: imprime «positivo»; elif n < 0: imprime «negativo»; else: imprime «cero».

Si usaras otro if en lugar del elif, funcionaría, pero el else quedaría unido solo a ese segundo if. Con elif las tres opciones forman una única cadena.

Pregunta 10Única

¿Qué hace la expresión condicional r = 'par' if n % 2 == 0 else 'impar'?

  1. Guarda en r 'par' o 'impar' según el valor de n
  2. Da un error: el if no puede ir a la derecha del =
  3. Guarda siempre 'par'
  4. Imprime par o impar
Solución

Respuesta: Guarda en r 'par' o 'impar' según el valor de n

La forma es valor_si_cierto if condición else valor_si_falso. Viene bien para asignaciones cortas; si hay más de dos casos, mejor un if/elif normal.

Pregunta 11Única

¿Qué imprime este código?

x = 7
if x > 5:
    if x > 10:
        print("A")
    else:
        print("B")
else:
    print("C")
  1. B
  2. A
  3. C
  4. B y C
Solución

Respuesta: B

Es un if anidado: la sangría dice a qué if pertenece cada else. El else de print("B") es del if x > 10, y el de print("C"), del if x > 5.

Pregunta 12Ordenar

Ordena las líneas para clasificar una temperatura t (más de 30 calor, más de 15 templado y si no, frío):

  1. print('frío')
  2. else:
  3. elif t > 15:
  4. print('calor')
  5. print('templado')
  6. if t > 30:
Solución

Orden correcto:

  1. if t > 30:
  2. print('calor')
  3. elif t > 15:
  4. print('templado')
  5. else:
  6. print('frío')

El orden de las condiciones importa: si pusieras primero t > 15, una temperatura de 35 diría «templado» y nunca llegaría a «calor». Empieza siempre por el caso más restrictivo.

Pregunta 13Única

¿Qué valor tiene c al terminar?

a, b = 50, 25
c = 0
if a > b and b > 30:
    c = 1
elif a > b or b > 30:
    c = 2
print(c)
  1. 2
  2. 1
  3. 0
  4. 3
Solución

Respuesta: 2

a > b and b > 30 es True and False = False. a > b or b > 30 es True or False = True, así que c = 2.

Míralo paso a paso en Python Tutor

El fragmento 3 es el que más cuesta ver leyendo, así que míralo en directo. En pythontutor.com, elige Python 3 y pega este programa, que tiene las dos versiones una detrás de otra (A con el else mal sangrado y B corregida):

edad = 15
tiene_entrada = True

# A: el else está sangrado dentro del if interior
if edad >= 18:
    if tiene_entrada:
        print("A: puede entrar")
    else:
        print("A: menor de edad")

# B: el else a la altura del primer if
if edad >= 18:
    if tiene_entrada:
        print("B: puede entrar")
    else:
        print("B: le falta la entrada")
else:
    print("B: menor de edad")

La salida real es una sola línea:

B: menor de edad

Qué observar paso a paso:

  1. En el primer if edad >= 18: (versión A), la flecha salta directamente al comentario de la versión B: con edad = 15, todo el bloque A, else incluido, se salta.
  2. Fíjate en que en la versión A nunca se pisa ningún print: por eso no sale ninguna línea con «A:».
  3. En la versión B, la flecha pasa de if edad >= 18: al else: de la penúltima línea, porque ese else está a la altura del primer if.
  4. Cambia edad a 20 y tiene_entrada a False: ahora la versión A imprime «A: menor de edad» a un adulto (el mensaje equivocado en la rama equivocada) y la B imprime «B: le falta la entrada».

Chuletario: Condicionales en Python

Lo esencial en 30 segundos

  • if / elif / else: dos puntos al final y 4 espacios de sangría en el bloque.
  • En una cadena, solo se ejecuta el primer bloque cuyo resultado es True.
  • Con >=, umbrales de mayor a menor; con <=, de menor a mayor.
  • Comprobaciones independientes → varios if. Casos excluyentes → elif.
  • Rangos con and o encadenados: 0 <= nota <= 10. Nunca x == "a" or "b".
  • Cero y vacío son False; todo lo demás, True ("0" también).
  • Un else pertenece al if que está a su misma altura.

Quiero…

Quiero…CódigoResultado
Hacer algo solo si se cumpleif nota < 5: print("Repasa")Con 4.0 imprime; con 7.5, nada
Elegir entre dosif nota >= 5: … else: …Siempre se ejecuta uno de los dos
Elegir entre variosif … elif … elif … elseSolo el primer True
Comprobar un rangoif 0 <= nota <= 10:Con 12 → False
Aceptar «s» y «S»if respuesta.lower() == "s":"S" → True
Ver si una lista tiene algoif entregas:[] → False
Elegir un valor en una línea"Aprobado" if nota >= 5 else "Suspenso"Con 6.0 → "Aprobado"
Ver si un texto contiene algoif "@" in email:True o False
Evitar dividir entre ceroif n > 0 and total / n >= 5:Con n = 0 no divide

Plantillas de los ejercicios

Clasificar por tramos (ejercicios 2 y 3, patrón de FP1):

if valor <= tramo_1:          # con <=, de menor a mayor
    resultado = "A"
elif valor <= tramo_2:        # ya sabemos que valor > tramo_1
    resultado = "B"
else:                         # todo lo que queda
    resultado = "C"

Con el ejercicio 2, valor = 28000 cae en el tramo de <= 35200 y da un 30 %.

Contar criterios independientes (ejercicio 3):

puntos = 0
if criterio_1:                # cada if suma por su cuenta
    puntos += 1
if criterio_2:
    puntos += 1

Con "Python@2024", los cinco criterios suman y puntos llega a 5.

Decidir con una excepción (ejercicio 1):

if edad >= edad_minima or (va_acompanado and clasificacion != "NC-17"):
    print("Puede verla")
else:
    print("No puede verla")

Con 15 años, R y sin adulto: False or False → «No puede verla».

Síntoma y causa probable

SíntomaCausa probable
SyntaxError: expected ':'Faltan los dos puntos al final del if, elif o else
SyntaxError: invalid syntax. Maybe you meant '=='…Has escrito = en lugar de == en la condición
IndentationError: expected an indented blockLa línea de debajo del if no está sangrada
TypeError: '>=' not supported between instances of 'str' and 'int'Comparas un texto (de input()) con un número: falta int() o float()
Una nota alta sale «Aprobado»Los elif con >= están de menor a mayor
La condición entra siemprex == "a" or "b", o un rango escrito con or
No sale nada por pantallaUn else sangrado dentro del if equivocado, o ninguna rama cumple y no hay else
NameError al usar una variable después del ifAlguna rama no la asigna (falta el else)
Un menú dice siempre «opción no válida»Comparas el texto de input() con un número (opcion == 1)

Antes de entregar, pregúntate

  1. ¿He probado cada umbral con su valor exacto y con el de justo debajo?
  2. Mis comprobaciones, ¿son independientes (varios if) o excluyentes (elif)?
  3. ¿Cada lado de mis and y or es una comparación completa?
  4. ¿Todas las variables que uso después de la cadena se asignan en todas las ramas?

Con los condicionales dominados, el siguiente paso es repetir decisiones sin copiar código: bucles en Python. Y si algo de este artículo se te ha atragantado, vuelve a la teoría, a la práctica o un paso más atrás, a los operadores en Python.

Sigue aprendiendoTodos los artículos de Python

¿Te ha servido este artículo? Así puedes apoyar SergioLearns →

Sigue aprendiendo

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *