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.
Tabla de Contenidos
Cómo usar este artículo
- 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(). - Intenta resolverlo en VS Code sin mirar nada. Si llevas más de 10 minutos atascado, lee la pista.
- 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.
- 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ón | Significado | Edad mínima sin adulto |
|---|---|---|
| G | Todos los públicos | 0 |
| PG | Menores de 10 con un adulto | 10 |
| PG-13 | No recomendada para menores de 13 años | 13 |
| R | No recomendada para menores de 17 años | 17 |
| NC-17 | Solo mayores de 18 años | 18 |
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 anual | Tipo |
|---|---|
| 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:
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"esFalsey el programa diría «Clasificación r no reconocida».- La cadena solo asigna. Es el patrón de FP1: primero se decide
edad_minimaydescripcion; después, una sola decisión de acceso que vale para todas las clasificaciones. Si pusieras unprintde acceso en cada rama, tendrías la misma condición repetida cinco veces. -1como marca de «desconocida». Ninguna edad mínima real es negativa, así que-1no se puede confundir con una clasificación válida y la variable existe en todas las ramas (sin elelse, usaredad_minimadespués daríaNameErrorcon una clasificación rara).
La línea clave, con zoom:
if edad >= edad_minima or (va_acompanado and clasificacion != "NC-17"):
| Parte | Con edad 15, R, sin adulto | Valor |
|---|---|---|
edad >= edad_minima | 15 >= 17 | False |
va_acompanado | False | False |
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 <= 12450esFalse;28000 <= 20200esFalse;28000 <= 35200esTrue→ 30 %. Al llegar a cadaelifya sabemos que el salario supera el tramo anterior, así que no hace falta escribirsalario > 12450 and salario <= 20200.- El
elserecoge «más de 60.000». No hace falta escribirsalario > 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:.2fse imprime1633.33.
| Comparación | Resultado | ¿Qué hace? |
|---|---|---|
28000 <= 12450 | False | Siguiente |
28000 <= 20200 | False | Siguiente |
28000 <= 35200 | True | tipo = 30 y sale de la cadena |
28000 <= 60000 | No 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
ifindependientes para los criterios. Una contraseña puede cumplir varios a la vez, y cada uno suma su punto. Con una cadenaelif, en cuanto se cumpliera el primero (la longitud) el resto ni se miraría y"Python@2024"sacaría 1 punto. - Una cadena
elifpara la clasificación. Aquí sí: la puntuación cae en una sola categoría.puntos <= 2va 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.
| Criterio | Comprobación | ¿Cumple? | puntos después |
|---|---|---|---|
| Longitud | 11 >= 8 | ✓ | 1 |
| Mayúsculas | la P | ✓ | 2 |
| Minúsculas | y, t, h… | ✓ | 3 |
| Números | 2, 0, 2, 4 | ✓ | 4 |
| Especiales | la @ 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/elsede tres caminos dentro del bucle. Cada intento es menor, mayor o igual que el secreto: tres casos excluyentes, así que es una cadena. Elelseno necesita escribirintento == numero_secreto: si no es menor ni mayor, es igual. jugadas[intentos]antes deintentos += 1. En la primera vueltaintentosvale 0, yjugadas[0]es la primera jugada. Si sumaras antes, empezarías porjugadas[1]y te saltarías el 50.- La valoración con
<=en orden creciente. «De 4 a 6» no necesitaintentos >= 4 and intentos <= 6: si llega aelif 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:
| Vuelta | jugadas[intentos] | intentos después | Comparación que acierta | Mensaje | adivinado |
|---|---|---|---|---|---|
| 1 | jugadas[0] = 50 | 1 | 50 < 69 | Demasiado bajo | False |
| 2 | jugadas[1] = 75 | 2 | 75 > 69 | Demasiado alto | False |
| 3 | jugadas[2] = 63 | 3 | 63 < 69 | Demasiado bajo | False |
| 4 | jugadas[3] = 69 | 4 | ninguna → 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.
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.
¿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.
¿Cómo sabe Python qué instrucciones están dentro de un if?
- Por la sangría (los espacios al principio de la línea)
- Por las llaves
{ } - Por la palabra
endal final - 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.
¿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.
¿Qué imprime este código?
edad = 17
if edad >= 18:
print("Puede votar")
print("Fin")- Solo
Fin Puede votaryFin- Nada
- 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.
¿Cuál es la forma correcta de comprobar que n está entre 1 y 10 (ambos incluidos)?
1 <= n <= 101 <= n or n <= 10n >= 1 and <= 10n 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.
Sobre if, elif y else:
- Un
ifpuede ir sinelse. - Un
elsepuede llevar su propia condición:else x > 3:. - Puede haber tantos
elifcomo hagan falta. - Si se cumplen varias condiciones de una cadena
if/elif, se ejecutan todos esos bloques.
Solución
- V — Un
ifpuede ir sinelse. - F — Un
elsepuede llevar su propia condición:else x > 3:. - V — Puede haber tantos
elifcomo 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.
¿Qué imprime este código?
t = ""
if t:
print("con texto")
else:
print("vacío")vacíocon texto- Un error, porque
tno es booleano - 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».
¿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.
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.
¿Qué hace la expresión condicional r = 'par' if n % 2 == 0 else 'impar'?
- Guarda en
r'par'o'impar'según el valor den - Da un error: el
ifno puede ir a la derecha del= - Guarda siempre
'par' - Imprime
paroimpar
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.
¿Qué imprime este código?
x = 7
if x > 5:
if x > 10:
print("A")
else:
print("B")
else:
print("C")BACByC
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.
Ordena las líneas para clasificar una temperatura t (más de 30 calor, más de 15 templado y si no, frío):
print('frío')else:elif t > 15:print('calor')print('templado')if t > 30:
Solución
Orden correcto:
if t > 30:print('calor')elif t > 15:print('templado')else: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.
¿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)2103
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:
- En el primer
if edad >= 18:(versión A), la flecha salta directamente al comentario de la versión B: conedad = 15, todo el bloque A,elseincluido, se salta. - Fíjate en que en la versión A nunca se pisa ningún
print: por eso no sale ninguna línea con «A:». - En la versión B, la flecha pasa de
if edad >= 18:alelse:de la penúltima línea, porque eseelseestá a la altura del primerif. - Cambia
edada20ytiene_entradaaFalse: 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
ando encadenados:0 <= nota <= 10. Nuncax == "a" or "b". - Cero y vacío son
False; todo lo demás,True("0"también). - Un
elsepertenece alifque está a su misma altura.
Quiero…
| Quiero… | Código | Resultado |
|---|---|---|
| Hacer algo solo si se cumple | if nota < 5: print("Repasa") | Con 4.0 imprime; con 7.5, nada |
| Elegir entre dos | if nota >= 5: … else: … | Siempre se ejecuta uno de los dos |
| Elegir entre varios | if … elif … elif … else | Solo el primer True |
| Comprobar un rango | if 0 <= nota <= 10: | Con 12 → False |
| Aceptar «s» y «S» | if respuesta.lower() == "s": | "S" → True |
| Ver si una lista tiene algo | if entregas: | [] → False |
| Elegir un valor en una línea | "Aprobado" if nota >= 5 else "Suspenso" | Con 6.0 → "Aprobado" |
| Ver si un texto contiene algo | if "@" in email: | True o False |
| Evitar dividir entre cero | if 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íntoma | Causa 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 block | La 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 siempre | x == "a" or "b", o un rango escrito con or |
| No sale nada por pantalla | Un else sangrado dentro del if equivocado, o ninguna rama cumple y no hay else |
NameError al usar una variable después del if | Alguna 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
- ¿He probado cada umbral con su valor exacto y con el de justo debajo?
- Mis comprobaciones, ¿son independientes (varios
if) o excluyentes (elif)? - ¿Cada lado de mis
andyores una comparación completa? - ¿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 →




Qué es un sistema operativo — teoría con tu portátil en una tarde de estudio, una llamada a write() y la CPU que nunca descansa (y los tres programas que no se ejecutaban a la vez)