Bucles en Python

Aprendé a repetir acciones con for y while. Los bucles son esenciales para procesar colecciones de datos y automatizar tareas repetitivas.

for — iterar sobre una secuencia

El bucle for recorre cada elemento de una secuencia (lista, string, rango, etc.) y ejecuta el bloque una vez por cada elemento.

# Iterar sobre una lista
frutas = ["manzana", "naranja", "uva"]
for fruta in frutas:
    print(fruta)

# Iterar sobre un string
for letra in "Python":
    print(letra, end=" ")  # P y t h o n

# Iterar sobre un rango de números
for i in range(5):
    print(i, end=" ")  # 0 1 2 3 4
end=" " en print()

Por defecto print() agrega un salto de línea al final. Con end=" " le decís que en vez de salto de línea ponga un espacio — útil para imprimir en la misma línea.

Probá el Ejemplo 1: for básico

range() — generar secuencias de números

range() genera una secuencia de números sin ocupar memoria. Muy usado con for.

range(stop)           # 0, 1, 2, ..., stop-1
range(start, stop)    # start, start+1, ..., stop-1
range(start, stop, step)  # con paso personalizado
print(list(range(5)))         # [0, 1, 2, 3, 4]
print(list(range(1, 6)))      # [1, 2, 3, 4, 5]
print(list(range(0, 10, 2)))  # [0, 2, 4, 6, 8]
print(list(range(10, 0, -1))) # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

# Contar del 1 al 10 e impirmir solo los impares
for n in range(1, 11, 2):
    print(n, end=" ")  # 1 3 5 7 9

# Tabla de multiplicar del 7
for i in range(1, 11):
    print(f"7 x {i:2} = {7 * i}")
Probá el Ejemplo 2: range()

while — repetir mientras se cumpla una condición

El bucle while repite el bloque mientras la condición sea verdadera. Lo usás cuando no sabés de antemano cuántas repeticiones necesitás.

contador = 0

while contador < 5:
    print(f"Contador: {contador}")
    contador += 1  # IMPORTANTE: actualizar la variable

print("¡Listo!")
Cuidado con el bucle infinito

Si la condición nunca se vuelve falsa, el programa se cuelga. Siempre asegurate de que el while tenga una forma de terminar — ya sea actualizando la variable o usando break.

while con entrada del usuario

intentos = 0
password = "1234"

while intentos < 3:
    ingresado = input("Contraseña: ")
    if ingresado == password:
        print("¡Acceso concedido!")
        break
    intentos += 1
    print(f"Incorrecto. Intentos restantes: {3 - intentos}")
else:
    # El else del while se ejecuta si NO se usó break
    print("Cuenta bloqueada")
Probá el Ejemplo 3: while

break, continue y pass

break — salir del bucle

numeros = [1, 3, 7, 2, 9, 4, 6]

for n in numeros:
    if n % 2 == 0:
        print(f"Primer par encontrado: {n}")
        break  # sale del for al encontrar el primero

continue — saltar a la siguiente iteración

for n in range(10):
    if n % 2 == 0:
        continue  # salta los pares
    print(n, end=" ")  # 1 3 5 7 9

pass — no hacer nada (placeholder)

for n in range(5):
    if n == 3:
        pass  # por ahora no hacemos nada, pero el bucle no falla
    print(n)

break

Termina el bucle completamente

Sale del for o while al instante

continue

Salta esta iteración

Va directo a la siguiente vuelta

pass

No hace nada

Útil como placeholder temporal

Bucles anidados

Un bucle dentro de otro. El bucle interno se ejecuta completo por cada iteración del externo.

# Tabla de multiplicar
for i in range(1, 4):
    for j in range(1, 4):
        print(f"{i} x {j} = {i*j}", end="   ")
    print()  # salto de línea al terminar la fila

# Salida:
# 1 x 1 = 1   1 x 2 = 2   1 x 3 = 3
# 2 x 1 = 2   2 x 2 = 4   2 x 3 = 6
# 3 x 1 = 3   3 x 2 = 6   3 x 3 = 9
Evitá demasiados niveles de anidamiento

Más de 2 o 3 niveles de bucles anidados hace el código difícil de leer. Si llegás a 3 niveles, considerá refactorizar con funciones.

Funciones útiles con bucles

nombres = ["Ana", "Carlos", "Beatriz", "Diego"]
precios = [100, 250, 75, 300]

# enumerate() — índice + valor
for i, nombre in enumerate(nombres, 1):
    print(f"{i}. {nombre}")

# zip() — iterar dos listas juntas
for nombre, precio in zip(nombres, precios):
    print(f"{nombre}: ${precio}")

# reversed() — iterar al revés
for nombre in reversed(nombres):
    print(nombre)

# sorted() — iterar ordenado sin modificar original
for nombre in sorted(nombres):
    print(nombre)

Ejemplo Completo

Análisis de ventas con bucles:

ventas = [
    {"producto": "Laptop",   "cantidad": 3,  "precio": 1200},
    {"producto": "Mouse",    "cantidad": 15, "precio": 25},
    {"producto": "Teclado",  "cantidad": 8,  "precio": 75},
    {"producto": "Monitor",  "cantidad": 5,  "precio": 450},
    {"producto": "Auricular","cantidad": 12, "precio": 60},
]

total_general = 0
print(f"{'Producto':<12} {'Cant':>4} {'Precio':>8} {'Subtotal':>10}")
print("-" * 40)

for v in ventas:
    subtotal = v["cantidad"] * v["precio"]
    total_general += subtotal
    print(f"{v['producto']:<12} {v['cantidad']:>4} ${v['precio']:>7} ${subtotal:>9}")

print("-" * 40)
print(f"{'TOTAL':>27} ${total_general:>9}")

# Encontrar el producto más vendido
mas_vendido = max(ventas, key=lambda v: v["cantidad"])
print(f"\nMás vendido: {mas_vendido['producto']} ({mas_vendido['cantidad']} unidades)")
Probá el Ejemplo 4: Análisis de ventas

Buenas Prácticas

  • for para colecciones, while para condiciones — no uses while para iterar listas si podés usar for
  • enumerate() en vez de range(len()) — más claro y pythónico
  • zip() para iterar dos listas juntas — más legible que el índice
  • Cuidado con el while infinito — siempre incluí una condición de salida
  • Evitá modificar una lista mientras la iterás — comportamiento impredecible
  • List comprehension para crear listas — más eficiente que append() en un loop