En esta páginaCondicionales y bucles
Condicionales y bucles
- Nivel: principiante
- Úsala cuando: necesites tomar decisiones o repetir una operación
- Conocimientos previos útiles: variables, tipos y operadores
En esta página escribirás un programa que clasifica puntuaciones y controla cuántos intentos procesa. Antes practicarás cómo seguir una condición o un bucle línea por línea con comparaciones, % y print(). Puedes ejecutar todo el código de forma local con Python 3.
Qué puedes consultar aquí
- construir condiciones y explicar cuándo producen
TrueoFalse; - identificar cuál rama de
if,elifyelsese ejecuta; - elegir entre
forywhile, y controlar sus vueltas concontinueybreak; - localizar un fallo de flujo mediante una tabla de traza.
1. Condiciones: preguntas que dan True o False
Los operadores ==, !=, <, <=, > y >= comparan valores. Cada comparación siguiente produce un valor booleano. and exige que sus dos partes sean verdaderas, or exige al menos una y not invierte True y False.
edad = 16
tiene_permiso = True
print(edad >= 15)
print(edad < 18)
print(edad >= 15 and tiene_permiso)
print(edad >= 18 or tiene_permiso)
print(not tiene_permiso)
Salida:
True
True
True
True
False
Para and, el resultado depende de ambas partes:
| Primera parte | Segunda parte | Resultado |
|---|---|---|
False | False | False |
False | True | False |
True | False | False |
True | True | True |
Python determina si la expresión usada como condición es verdadera o falsa. En estos ejemplos usamos comparaciones, cuyo resultado sí es bool. Recuerda la diferencia: = asigna un valor y == compara dos valores. Escribir if edad = 18: causa SyntaxError; no produce False.
2. Elegir una ruta con if, elif y else
Los encabezados de las ramas terminan en :. Su cuerpo lleva una indentación consistente de cuatro espacios. Python prueba el if y luego cada elif pendiente; ejecuta solo la primera rama verdadera. else es opcional, no lleva condición y cubre los demás casos.
edad = 16
tiene_permiso = True
if edad >= 18:
mensaje = "acceso completo"
elif edad >= 15 and tiene_permiso:
mensaje = "acceso con permiso"
else:
mensaje = "acceso denegado"
print(mensaje)
Con edad = 14 y permiso, se ejecuta else. Con edad = 16 y permiso, se ejecuta elif. Con edad = 18 y sin permiso, se ejecuta el primer bloque y el elif ya no se evalúa. Ese orden clasifica correctamente los valores límite 15 y 18.
3. Repetir una cantidad conocida: for y range
Un for recorre valores de un iterable. Aquí range proporciona una sucesión numérica, útil cuando conocemos cuántas vueltas necesitamos.
for turno in range(1, 5):
print(turno)
La salida es 1, 2, 3 y 4, cada valor en una línea. El límite final, 5, no se incluye.
Las formas disponibles son range(fin), range(inicio, fin) y range(inicio, fin, paso). Por ejemplo, range(5) recorre de 0 a 4. Este ejemplo usa un paso de 2:
for numero in range(2, 11, 2):
print(numero)
Salida:
2
4
6
8
10
4. Repetir mientras algo sea cierto: while
while comprueba su condición antes de cada vuelta. El bloque necesita una actualización que permita llegar al final.
intentos = 1
while intentos <= 3:
print(f"Intento {intentos}")
intentos += 1
intentos <= 3 es la condición, las dos líneas indentadas forman el cuerpo y intentos += 1 actualiza el estado. El operador += suma el valor de la derecha al valor actual y vuelve a asignar el resultado: aquí equivale a intentos = intentos + 1. Si intentos comenzara en 4, el cuerpo se ejecutaría cero veces.
Usa for para recorrer candidatos o una cantidad conocida. Usa while cuando continuar depende de un estado que cambia durante la ejecución.
5. Saltar o terminar: continue y break
continue omite el resto de la vuelta actual y pasa a la siguiente. Este programa no imprime los números pares:
for numero in range(1, 6):
if numero % 2 == 0:
continue
print(numero)
break termina el bucle más cercano. No termina por sí mismo todo el programa.
for numero in range(1, 7):
if numero == 4:
break
print(numero)
print("fin")
La salida contiene 1, 2, 3 y luego fin. El siguiente programa reúne ambos controles:
suma = 0
for numero in range(1, 6):
if numero == 3:
continue
suma += numero
if suma >= 7:
break
print(suma)
Imprime 7. Cuando numero vale 3, continue evita la suma. Con 4, suma llega a 7 y break termina el for; el candidato 5 nunca se visita.
Visualiza el recorrido
Sigue paso a paso el programa anterior. Antes de avanzar, predice la línea activa, los valores de numero y suma, y si ocurrirá continue o break. Comprueba también por qué el candidato 5 queda sin visitar. Después podrás aplicar el mismo recorrido ordenado al reto.
Traza de continue y break
Predice el siguiente paso; usa Anterior, Siguiente y Reiniciar para comprobar cómo cambian numero y suma.
suma = 01pendiente2pendiente3pendiente4pendiente5pendiente
Paso 1: suma = 0. El acumulador queda preparado. numero: sin asignar; suma: 0.
Comprueba tu lectura de un bucle
total = 0
for n in range(1, 5):
if n == 2:
continue
total += n
if total >= 4:
break
print(total)
6. Depurar el control de flujo
Una traza registra lo que ocurre, sin adivinar. Reproduce el problema con un caso pequeño y anota, paso a paso, la línea, las variables, la condición y la salida. Compara después el límite esperado con el real; cambia una sola cosa y repite la traza.
Un print() temporal permite observar el estado:
contador = 1
while contador <= 3:
print(f"traza: contador={contador}, condicion={contador <= 3}")
contador += 1
Retira ese print() cuando termines de localizar el fallo.
Errores comunes
- Dentro de una condición, usa
==para la comparación, no=. - El fin excluido de
range(1, 5)hace que visite 1, 2, 3 y 4. Usarange(1, 6)si también necesitas 5. - Un
whilecon estado inmóvil puede repetirse indefinidamente. - Si
continueaparece antes de actualizar el contador, esa ruta causa una actualización omitida y puede conservar siempre el mismo valor. - Una línea con indentación desplazada queda fuera de la rama o del bucle, aunque visualmente parezca relacionada.
- Si
if nota >= 60aparece antes deelif nota >= 90, la segunda es una rama inalcanzable para una nota de 95. Comprueba primeronota >= 90.
Práctica
Resuelve las tres trazas sin ejecutar el código. Escribe los candidatos visitados, cada condición y la salida.
Traza 1: fronteras de una decisión
Prueba por separado edad = 14, edad = 15 y edad = 18.
edad = 14
if edad >= 18:
mensaje = "acceso completo"
elif edad >= 15:
mensaje = "acceso con permiso"
else:
mensaje = "acceso denegado"
print(mensaje)
Traza 2: límite y salto
for numero in range(1, 6):
if numero % 2 == 0:
continue
print(numero)
Traza 3: repetición sin avance
Encuentra por qué el programa no termina y propón una corrección.
intentos = 1
while intentos <= 3:
if intentos == 2:
continue
print(intentos)
intentos += 1
Soluciones de las trazas
Traza 1
| Paso | Línea | Variables | Condición | Acción o salida |
|---|---|---|---|---|
| 14.1 | if | edad=14 | edad >= 18 es False | prueba elif |
| 14.2 | elif | edad=14 | edad >= 15 es False | pasa a else |
| 14.3 | else | edad=14 | no tiene condición | asigna acceso denegado |
| 14.4 | print | mensaje=acceso denegado | no aplica | imprime acceso denegado |
| 15.1 | if | edad=15 | edad >= 18 es False | prueba elif |
| 15.2 | elif | edad=15 | edad >= 15 es True | asigna acceso con permiso |
| 15.3 | print | mensaje=acceso con permiso | no aplica | imprime acceso con permiso |
| 18.1 | if | edad=18 | edad >= 18 es True | asigna acceso completo |
| 18.2 | print | mensaje=acceso completo | no aplica | imprime acceso completo |
Traza 2
| Paso | Línea | Variables | Condición | Acción o salida |
|---|---|---|---|---|
| 1.1 | if | numero=1 | 1 % 2 == 0 es False | sigue dentro del bucle |
| 1.2 | print | numero=1 | no aplica | imprime 1 |
| 2.1 | if | numero=2 | 2 % 2 == 0 es True | entra en la rama |
| 2.2 | continue | numero=2 | no aplica | pasa a numero=3 |
| 3.1 | if | numero=3 | 3 % 2 == 0 es False | sigue dentro del bucle |
| 3.2 | print | numero=3 | no aplica | imprime 3 |
| 4.1 | if | numero=4 | 4 % 2 == 0 es True | entra en la rama |
| 4.2 | continue | numero=4 | no aplica | pasa a numero=5 |
| 5.1 | if | numero=5 | 5 % 2 == 0 es False | sigue dentro del bucle |
| 5.2 | print | numero=5 | no aplica | imprime 5 |
Traza 3
| Paso | Línea | Variables | Condición | Acción o salida |
|---|---|---|---|---|
| 1 | while | intentos=1 | 1 <= 3 es True | entra en el cuerpo |
| 2 | if | intentos=1 | 1 == 2 es False | sigue a print |
| 3 | print | intentos=1 | no aplica | imprime 1 |
| 4 | intentos += 1 | intentos=2 | no aplica | actualiza el contador |
| 5 | while | intentos=2 | 2 <= 3 es True | vuelve a entrar |
| 6 | if | intentos=2 | 2 == 2 es True | entra en la rama |
| 7 | continue | intentos=2 | no aplica | vuelve a evaluar while |
| 8 | while | intentos=2 | 2 <= 3 es True | repite desde el paso 6 |
La repetición continúa porque intentos += 1 no se alcanza cuando el valor es 2. Una corrección mantiene la actualización en todas las rutas:
intentos = 1
while intentos <= 3:
if intentos != 2:
print(intentos)
intentos += 1
Para modificar el primer ejercicio, cambia la frontera intermedia a 16 y vuelve a trazar 15 y 16. Para crear una variante, escribe un for que recorra del 1 al 8, omita múltiplos de 3 y compruebe numero == 7 antes de imprimir. La salida exacta debe ser 1, 2, 4 y 5, cada valor en una línea; 7 no se imprime.
Reto
Construye un control de acceso a una práctica. Debe aceptar como máximo cinco puntuaciones válidas. En cada vuelta, pide un entero; -1 termina la captura y cualquier valor fuera de 0 a 100 se vuelve a pedir sin consumir un intento válido.
Clasifica 90 a 100 como avanzado, 70 a 89 como listo y 0 a 69 como repasar. Una puntuación de 100 termina el proceso. Al final imprime cuántos valores válidos procesaste.
Usa un solo while con un contador que comience en 0 y continúe mientras sea menor que 5; no necesitas anidar bucles. Dentro del bucle, sigue este orden:
- pide la puntuación;
- usa
breaksi es-1; - si está fuera de 0 a 100, informa que no es válida y usa
continue; - incrementa el contador, clasifica con
if/elif/elsey usabreaksi la puntuación es 100.
No uses listas, funciones, imports ni excepciones; puedes asumir que cada entrada se convierte con int().
Usa exactamente el prompt Puntuación (-1 para terminar): . Para una entrada fuera del intervalo imprime Puntuación no válida. Para cada valor válido imprime Clasificación: seguido de su categoría. Al salir del bucle imprime Puntuaciones válidas: seguido del contador.
Prueba estas cuatro secuencias concretas:
-
Entradas:
65,74,92,-1. El prompt aparece cuatro veces. Las líneas producidas porprint()deben ser:Clasificación: repasar Clasificación: listo Clasificación: avanzado Puntuaciones válidas: 3 -
Entradas:
120,80,-1. El prompt aparece tres veces. Las líneas producidas porprint()deben ser:Puntuación no válida Clasificación: listo Puntuaciones válidas: 1 -
Entrada:
100. El prompt aparece una vez. Las líneas producidas porprint()deben ser:Clasificación: avanzado Puntuaciones válidas: 1 -
Entradas:
0,69,70,89,90. El prompt aparece cinco veces y no debe aparecer una sexta vez. Las líneas producidas porprint()deben ser:Clasificación: repasar Clasificación: repasar Clasificación: listo Clasificación: listo Clasificación: avanzado Puntuaciones válidas: 5
Al comparar, ignora el eco de los valores escritos que algunos terminales muestran junto al prompt. Cuenta cada llamada a input() como una aparición del prompt y compara por separado, en orden y con el texto exacto, solo las líneas creadas por print().
Comprueba cuatro aspectos: las fronteras son exactas; los límites son correctos; break y continue actúan en los casos previstos; y puedes explicar con una traza por qué el programa termina.
Lista de comprobación
- Puedo predecir qué rama se ejecuta para un valor de frontera.
- Puedo explicar por qué
range(1, 5)no visita 5. - Puedo justificar el uso de
forowhileen un caso concreto. - Puedo explicar la diferencia entre
breakycontinue. - Puedo completar una tabla de traza sin ejecutar el programa.
Puedes conservar la traza como registro local de las fronteras y actualizaciones que comprobaste.