Python ofrece mecanismos flexibles para repetir operaciones mediante ciclos. A diferencia de otros lenguajes, sus ciclos están diseñados para trabajar directamente con objetos iterables, lo que simplifica la manipulación de colecciones. A continuación, se exploran los ciclos for y while, sus controles avanzados y técnicas eficientes para procesar datos.
Ciclo for: Iteración sobre secuencias
El ciclo for itera sobre cualquier objeto iterable: listas, cadenas, diccionarios, rangos o generadores. No requiere índices ni condiciones numéricas explícitas.
# Iteración sobre una lista de números
for valor in [10, 20, 30, 40]:
print(f"Valor actual: {valor}")
# Recorrido de caracteres en una cadena
for letra in "Desarrollo":
print(letra.upper())
# Acceso a claves y valores en un diccionario
datos = {"nombre": "Ana", "edad": 28, "ciudad": "Madrid"}
for clave, valor in datos.items():
print(f"{clave}: {valor}")
Ciclo while: Repetición condicional
Este ciclo ejecuta un bloque mientras una expresión lógica sea verdadera. Ideal cuando el número de iteraciones no es predecible.
# Contador ascendente con control de límite
limite = 7
contador = 1
while contador <= limite:
if contador % 3 == 0:
print(f"Múltiplo de 3: {contador}")
contador += 1
# Uso con entrada del usuario
respuesta = ""
while respuesta.lower() != "salir":
respuesta = input("Escribe 'salir' para terminar: ")
print("Sesión finalizada.")
Control de flujo en ciclos
Python permite modificar el comportamiento de los ciclos con tres instrucciones clave.
# break: interrumpe el ciclo por completo
for i in range(15):
if i > 10:
break
print(f"Iteración: {i}")
# continue: salta a la siguiente iteración
for n in range(12):
if n % 4 == 0:
continue
print(f"No divisible por 4: {n}")
# else en ciclos: se ejecuta si no hubo break
for intento in range(3):
if intento == 2:
print("Último intento.")
break
else:
print("Todos los intentos completados sin interrupción.")
Técnicas avanzadas: comprensiones y generadores
Las comprensiones permiten construir colecciones en una sola línea, mejorando la legibilidad y eficiencia.
# Comprensión de lista: crea una lista con cuadrados
cuadrados_lista = [num ** 2 for num in range(1, 8) if num % 2 != 0]
# Comprensión de diccionario: mapea claves a valores transformados
precios = {"manzana": 1.2, "naranja": 0.8, "plátano": 0.6}
precios_con_descuento = {fruta: precio * 0.9 for fruta, precio in precios.items()}
# Generador: produce valores bajo demanda, sin almacenar en memoria
generador_cuadrados = (x * x for x in range(1000000))
# Solo se calculan cuando se consumen
primeros_tres = [next(generador_cuadrados) for _ in range(3)]
¿Cuándo usar cada tipo de ciclo?
- Usa
forcuando recorras una colección conocida: listas, archivos, rangos o datos estructurados. - Usa
whilecuando la condición de parada dependa de un estado dinámico: entrada de usuario, lectura de sensores o procesos asincrónicos.
Las comprensiones son preferibles para transformaciones simples de listas, mientras que los generadores son esenciales para manejar flujos grandes sin consumir memoria excesiva.