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 True o False;
  • identificar cuál rama de if, elif y else se ejecuta;
  • elegir entre for y while, y controlar sus vueltas con continue y break;
  • 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.

Python 3 · ejemplo reproducible
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 parteSegunda parteResultado
FalseFalseFalse
FalseTrueFalse
TrueFalseFalse
TrueTrueTrue

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.

Python 3 · ejemplo reproducible
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.

Python 3 · ejemplo reproducible
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:

Python 3 · ejemplo reproducible
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.

Python 3 · ejemplo reproducible
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:

Python 3 · ejemplo reproducible
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.

Python 3 · ejemplo reproducible
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:

Python 3 · ejemplo reproducible
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.

Mesa de prueba

Traza de continue y break

Predice el siguiente paso; usa Anterior, Siguiente y Reiniciar para comprobar cómo cambian numero y suma.

Paso 1 de 18
Línea ejecutadasuma = 0
numero despuéssin asignar
suma después0
Resultado de la líneaasigna 0 a suma
  1. 1pendiente
  2. 2pendiente
  3. 3pendiente
  4. 4pendiente
  5. 5pendiente

Paso 1: suma = 0. El acumulador queda preparado. numero: sin asignar; suma: 0.

Comprueba tu lectura de un bucle

Python 3 · ejemplo reproducible
total = 0

for n in range(1, 5):
    if n == 2:
        continue
    total += n
    if total >= 4:
        break

print(total)

¿Qué valor imprime total?

Puedes responder o seguir leyendo.

Selecciona una respuesta

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:

Python 3 · ejemplo reproducible
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. Usa range(1, 6) si también necesitas 5.
  • Un while con estado inmóvil puede repetirse indefinidamente.
  • Si continue aparece 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 >= 60 aparece antes de elif nota >= 90, la segunda es una rama inalcanzable para una nota de 95. Comprueba primero nota >= 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.

Python 3 · ejemplo reproducible
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

Python 3 · ejemplo reproducible
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.

Python 3 · ejemplo reproducible
intentos = 1

while intentos <= 3:
    if intentos == 2:
        continue
    print(intentos)
    intentos += 1

Soluciones de las trazas

Traza 1

PasoLíneaVariablesCondiciónAcción o salida
14.1ifedad=14edad >= 18 es Falseprueba elif
14.2elifedad=14edad >= 15 es Falsepasa a else
14.3elseedad=14no tiene condiciónasigna acceso denegado
14.4printmensaje=acceso denegadono aplicaimprime acceso denegado
15.1ifedad=15edad >= 18 es Falseprueba elif
15.2elifedad=15edad >= 15 es Trueasigna acceso con permiso
15.3printmensaje=acceso con permisono aplicaimprime acceso con permiso
18.1ifedad=18edad >= 18 es Trueasigna acceso completo
18.2printmensaje=acceso completono aplicaimprime acceso completo

Traza 2

PasoLíneaVariablesCondiciónAcción o salida
1.1ifnumero=11 % 2 == 0 es Falsesigue dentro del bucle
1.2printnumero=1no aplicaimprime 1
2.1ifnumero=22 % 2 == 0 es Trueentra en la rama
2.2continuenumero=2no aplicapasa a numero=3
3.1ifnumero=33 % 2 == 0 es Falsesigue dentro del bucle
3.2printnumero=3no aplicaimprime 3
4.1ifnumero=44 % 2 == 0 es Trueentra en la rama
4.2continuenumero=4no aplicapasa a numero=5
5.1ifnumero=55 % 2 == 0 es Falsesigue dentro del bucle
5.2printnumero=5no aplicaimprime 5

Traza 3

PasoLíneaVariablesCondiciónAcción o salida
1whileintentos=11 <= 3 es Trueentra en el cuerpo
2ifintentos=11 == 2 es Falsesigue a print
3printintentos=1no aplicaimprime 1
4intentos += 1intentos=2no aplicaactualiza el contador
5whileintentos=22 <= 3 es Truevuelve a entrar
6ifintentos=22 == 2 es Trueentra en la rama
7continueintentos=2no aplicavuelve a evaluar while
8whileintentos=22 <= 3 es Truerepite 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:

Python 3 · ejemplo reproducible
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:

  1. pide la puntuación;
  2. usa break si es -1;
  3. si está fuera de 0 a 100, informa que no es válida y usa continue;
  4. incrementa el contador, clasifica con if/elif/else y usa break si 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:

  1. Entradas: 65, 74, 92, -1. El prompt aparece cuatro veces. Las líneas producidas por print() deben ser:

    Clasificación: repasar
    Clasificación: listo
    Clasificación: avanzado
    Puntuaciones válidas: 3
    
  2. Entradas: 120, 80, -1. El prompt aparece tres veces. Las líneas producidas por print() deben ser:

    Puntuación no válida
    Clasificación: listo
    Puntuaciones válidas: 1
    
  3. Entrada: 100. El prompt aparece una vez. Las líneas producidas por print() deben ser:

    Clasificación: avanzado
    Puntuaciones válidas: 1
    
  4. Entradas: 0, 69, 70, 89, 90. El prompt aparece cinco veces y no debe aparecer una sexta vez. Las líneas producidas por print() 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 for o while en un caso concreto.
  • Puedo explicar la diferencia entre break y continue.
  • Puedo completar una tabla de traza sin ejecutar el programa.

Puedes conservar la traza como registro local de las fronteras y actualizaciones que comprobaste.

Cargando progreso…