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
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.
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!")
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
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