Cómo practicar con estos ejercicios de bucles for y while
Necesitas conocer el bucle for, el bucle while y la función range.
- Lee el contrato: qué recibe la función y qué debe devolver.
- Escribe la función y añade debajo las comprobaciones.
- Ejecuta ambas partes. Un
assertque pasa no imprime nada; si falla, apareceAssertionError. - Antes de abrir la solución, sigue a mano dos vueltas: qué valor tiene cada variable al empezar y al terminar la vuelta.
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.
Recorrer y acumular
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.
assert suma_hasta(0) == 0
assert suma_hasta(1) == 1
assert suma_hasta(5) == 15
assert suma_hasta(100) == 5050Ver 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
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.
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.
assert contar_pares([1, 2, 3, 4]) == 2
assert contar_pares([]) == 0
assert contar_pares([7, 9]) == 0
assert contar_pares([-2, 0, 8]) == 3Ver 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
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.
Contar y construir
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.
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] == -4Ver 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
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.
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.
assert factorial(0) == 1
assert factorial(1) == 1
assert factorial(5) == 120
assert factorial(10) == 3628800Ver 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
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.
Buscar y repetir con while
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.
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) == -1Ver 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
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.
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.
assert sumar_digitos(0) == 0
assert sumar_digitos(7) == 7
assert sumar_digitos(1234) == 10
assert sumar_digitos(1000) == 1
assert sumar_digitos(99) == 18Ver 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
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
rangeno se incluye. Para llegar hasta n necesitasrange(1, n + 1). - El resultado es solo el primer elemento
- Un
returndentro 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 fundamentosFuentes 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.