Repetir sin perder el control

6 ejercicios para entender los bucles for y while

Escribe funciones que puedas comprobar. Cada ejercicio trae un contrato claro, pruebas con assert, una pista y una solución explicada que abres cuando quieras.

6 ejercicios progresivosPistas y solucionesPruebas con assert

Cómo practicar con estos ejercicios de bucles for y while

Necesitas conocer el bucle for, el bucle while y la función range.

  1. Lee el contrato: qué recibe la función y qué debe devolver.
  2. Escribe la función y añade debajo las comprobaciones.
  3. Ejecuta ambas partes. Un assert que pasa no imprime nada; si falla, aparece AssertionError.
  4. Antes de abrir la solución, sigue a mano dos vueltas: qué valor tiene cada variable al empezar y al terminar la vuelta.
Las funciones devuelven, no imprimen.

Cada solución usa return. Mostrar un valor con print no sustituye al resultado que espera recibir quien llama a la función.

Todas las soluciones incluyen sus pruebas y puedes abrirlas en el editor con el botón «Probar en el editor». Las comprobaciones son educativas y no sustituyen toda la validación de una aplicación real.

Nivel 1

Recorrer y acumular

Ejercicio 01

Suma los números hasta n

Escribe suma_hasta(n). Recibe un entero mayor o igual que 0 y devuelve la suma de 1 hasta n, usando un bucle. suma_hasta(0) devuelve 0.

Comprobaciones · añade tu función antes
assert suma_hasta(0) == 0
assert suma_hasta(1) == 1
assert suma_hasta(5) == 15
assert suma_hasta(100) == 5050
Ver una pista para el ejercicio 1

Necesitas un acumulador que empiece en cero y se actualice en cada vuelta. range(1, n + 1) incluye n.

Ver solución y explicación del ejercicio 1
Solución completa · ejercicio 01
def suma_hasta(n):
    total = 0
    for numero in range(1, n + 1):
        total += numero
    return total

assert suma_hasta(0) == 0
assert suma_hasta(1) == 1
assert suma_hasta(5) == 15
assert suma_hasta(100) == 5050
print("Pruebas superadas")

El segundo límite de range no se incluye, por eso es n + 1. El return está fuera del bucle: si estuviera dentro, la función terminaría en la primera vuelta.

Ejercicio 02

Cuenta los números pares

Escribe contar_pares(numeros). Recibe una lista de enteros y devuelve cuántos son pares. Una lista vacía devuelve 0.

Comprobaciones · añade tu función antes
assert contar_pares([1, 2, 3, 4]) == 2
assert contar_pares([]) == 0
assert contar_pares([7, 9]) == 0
assert contar_pares([-2, 0, 8]) == 3
Ver una pista para el ejercicio 2

Un número es par si el resto de dividirlo entre 2 es 0. Usa un contador que aumente solo cuando se cumpla.

Ver solución y explicación del ejercicio 2
Solución completa · ejercicio 02
def contar_pares(numeros):
    cantidad = 0
    for numero in numeros:
        if numero % 2 == 0:
            cantidad += 1
    return cantidad

assert contar_pares([1, 2, 3, 4]) == 2
assert contar_pares([]) == 0
assert contar_pares([7, 9]) == 0
assert contar_pares([-2, 0, 8]) == 3
print("Pruebas superadas")

El cero y los negativos pares también cuentan. El contador nace dentro de la función, así que cada llamada empieza desde cero.

Nivel 2

Contar y construir

Ejercicio 03

Genera los primeros múltiplos

Escribe multiplos(n). Devuelve una lista con n×1, n×2, … hasta n×10. Por ejemplo, multiplos(3) empieza en [3, 6, 9] y termina en 30.

Comprobaciones · añade tu función antes
assert multiplos(3)[:3] == [3, 6, 9]
assert multiplos(3)[-1] == 30
assert len(multiplos(7)) == 10
assert multiplos(0) == [0] * 10
assert multiplos(-2)[1] == -4
Ver una pista para el ejercicio 3

Construye una lista vacía y añade un valor en cada vuelta de range(1, 11).

Ver solución y explicación del ejercicio 3
Solución completa · ejercicio 03
def multiplos(n):
    resultado = []
    for factor in range(1, 11):
        resultado.append(n * factor)
    return resultado

assert multiplos(3)[:3] == [3, 6, 9]
assert multiplos(3)[-1] == 30
assert len(multiplos(7)) == 10
assert multiplos(0) == [0] * 10
assert multiplos(-2)[1] == -4
print("Pruebas superadas")

El resultado se crea dentro de la función para no compartirlo entre llamadas. Las pruebas con 0 y con un negativo comprueban que no se asume que n sea positivo.

Ejercicio 04

Calcula un factorial

Escribe factorial(n). Recibe un entero mayor o igual que 0 y devuelve el producto de 1 por 2 por … hasta n. Por definición, factorial(0) es 1.

Comprobaciones · añade tu función antes
assert factorial(0) == 1
assert factorial(1) == 1
assert factorial(5) == 120
assert factorial(10) == 3628800
Ver una pista para el ejercicio 4

Un acumulador de productos no puede empezar en 0: elige el valor neutro de la multiplicación.

Ver solución y explicación del ejercicio 4
Solución completa · ejercicio 04
def factorial(n):
    resultado = 1
    for numero in range(2, n + 1):
        resultado *= numero
    return resultado

assert factorial(0) == 1
assert factorial(1) == 1
assert factorial(5) == 120
assert factorial(10) == 3628800
print("Pruebas superadas")

Empezar en 1 evita anular todos los productos. Para n igual a 0 o 1 el bucle no se ejecuta y se devuelve el valor inicial, que es justo la definición.

Nivel 3

Buscar y repetir con while

Ejercicio 05

Encuentra la primera posición de un valor

Escribe primera_posicion(lista, valor). Devuelve el índice de la primera aparición del valor o -1 si no está. No uses el método index.

Comprobaciones · añade tu función antes
assert primera_posicion([5, 7, 5], 5) == 0
assert primera_posicion([5, 7, 5], 7) == 1
assert primera_posicion([5, 7, 5], 9) == -1
assert primera_posicion([], 1) == -1
Ver una pista para el ejercicio 5

Recorre con range(len(lista)) y devuelve en cuanto lo encuentres: es una de las pocas veces en que un return dentro del bucle es lo correcto.

Ver solución y explicación del ejercicio 5
Solución completa · ejercicio 05
def primera_posicion(lista, valor):
    for indice in range(len(lista)):
        if lista[indice] == valor:
            return indice
    return -1

assert primera_posicion([5, 7, 5], 5) == 0
assert primera_posicion([5, 7, 5], 7) == 1
assert primera_posicion([5, 7, 5], 9) == -1
assert primera_posicion([], 1) == -1
print("Pruebas superadas")

Aquí el return dentro del bucle es deliberado: termina la búsqueda al encontrar el valor. El -1 solo se devuelve cuando se han revisado todos los elementos sin éxito.

Ejercicio 06

Suma los dígitos de un número con while

Escribe sumar_digitos(n). Recibe un entero mayor o igual que 0 y devuelve la suma de sus dígitos usando un bucle while. sumar_digitos(1234) es 10.

Comprobaciones · añade tu función antes
assert sumar_digitos(0) == 0
assert sumar_digitos(7) == 7
assert sumar_digitos(1234) == 10
assert sumar_digitos(1000) == 1
assert sumar_digitos(99) == 18
Ver una pista para el ejercicio 6

Con n % 10 obtienes el último dígito y con n // 10 lo eliminas. El bucle termina cuando n llega a 0.

Ver solución y explicación del ejercicio 6
Solución completa · ejercicio 06
def sumar_digitos(n):
    total = 0
    while n > 0:
        total += n % 10
        n //= 10
    return total

assert sumar_digitos(0) == 0
assert sumar_digitos(7) == 7
assert sumar_digitos(1234) == 10
assert sumar_digitos(1000) == 1
assert sumar_digitos(99) == 18
print("Pruebas superadas")

El bucle tiene los tres elementos de un while: un estado inicial (n), una condición (n > 0) y una actualización (n //= 10) que acerca la condición a False.

Errores frecuentes en estos ejercicios

El bucle se detiene una vuelta antes
El segundo límite de range no se incluye. Para llegar hasta n necesitas range(1, n + 1).
El resultado es solo el primer elemento
Un return dentro del bucle termina toda la función. Acumula y devuelve después del bucle, salvo que busques un elemento.
El while no termina
La condición nunca llega a ser falsa. Comprueba que el cuerpo modifica la variable que usa la condición y usa el botón Detener del editor si hace falta.
El acumulador no cambia entre llamadas
Si lo defines fuera de la función, conserva su valor. Crea los acumuladores dentro, para que cada llamada empiece de cero.

Si no entiendes el traceback, empieza por su última línea en la guía de errores de Python.

Preguntas frecuentes sobre ejercicios de bucles for y while

¿Cuándo uso for y cuándo while?

Usa for para recorrer elementos o repetir un número conocido de veces, y while cuando repetir depende de una condición, como llegar a cero.

¿Qué es un acumulador?

Es una variable que empieza con un valor inicial y se actualiza en cada vuelta, como un total que suma o un contador que cuenta.

¿Debería usar range(len(lista))?

Solo si necesitas la posición. Para trabajar con cada elemento es más claro for elemento in lista.

Aplica los bucles a colecciones

Los bucles cobran más sentido cuando construyen y filtran listas.

Practicar listas →Ver los 12 ejercicios de fundamentos

Fuentes y compatibilidad

Los ejemplos usan Python 3 y la biblioteca estándar. Las instrucciones de instalación se contrastaron con la documentación oficial; los ejemplos de código se verifican con las comprobaciones de estas guías.

Consulta la metodología y las versiones del editor.