Python
Tutorial Python: Estructuras control iterativo
Aprende estructuras de control iterativo en Python: bucles for, while, break, continue, pass y else para controlar el flujo de tus programas.
Aprende Python y certifícateBucles for y sentencia range
Los bucles son estructuras fundamentales en programación que nos permiten ejecutar un bloque de código repetidamente. En Python, el bucle for
es una herramienta esencial para recorrer elementos uno a uno, automatizando tareas repetitivas de forma elegante y eficiente.
Bucle for básico
El bucle for
en Python está diseñado para iterar sobre una secuencia de elementos. A diferencia de otros lenguajes, Python simplifica la sintaxis haciendo que el bucle recorra directamente los elementos:
frutas = ["manzana", "banana", "cereza"]
for fruta in frutas:
print(fruta)
En este ejemplo, la variable fruta
toma el valor de cada elemento de la lista frutas
en cada iteración. El resultado sería:
manzana
banana
cereza
La función range()
La función range()
es una herramienta versátil que genera secuencias numéricas, perfecta para cuando necesitamos repetir una acción un número específico de veces. Su sintaxis básica es:
for i in range(stop):
# Código a ejecutar
Donde stop
es un valor entero que indica dónde terminar (sin incluirlo). Por ejemplo:
for i in range(5):
print(i)
Esto imprimirá los números del 0 al 4:
0
1
2
3
4
La función range()
puede recibir hasta tres parámetros:
- range(stop): Genera números desde 0 hasta stop-1
- range(start, stop): Genera números desde start hasta stop-1
- range(start, stop, step): Genera números desde start hasta stop-1, incrementando en step
Veamos ejemplos de cada caso:
# Números del 3 al 7
for i in range(3, 8):
print(i, end=" ") # 3 4 5 6 7
print() # Salto de línea
# Números pares del 2 al 10
for i in range(2, 11, 2):
print(i, end=" ") # 2 4 6 8 10
print() # Salto de línea
# Cuenta regresiva
for i in range(10, 0, -1):
print(i, end=" ") # 10 9 8 7 6 5 4 3 2 1
Iterando sobre índices
A veces necesitamos acceder tanto a los elementos como a sus posiciones. Para esto podemos combinar range()
con la longitud de la secuencia:
nombres = ["Ana", "Carlos", "Elena"]
for i in range(len(nombres)):
print(f"Posición {i}: {nombres[i]}")
Resultado:
Posición 0: Ana
Posición 1: Carlos
Posición 2: Elena
Una alternativa más elegante es usar la función enumerate()
, que devuelve pares de índice y valor:
nombres = ["Ana", "Carlos", "Elena"]
for indice, nombre in enumerate(nombres):
print(f"Posición {indice}: {nombre}")
Iterando sobre cadenas
Los bucles for
también pueden recorrer cada carácter de una cadena:
mensaje = "Python"
for letra in mensaje:
print(letra)
Esto imprimirá:
P
y
t
h
o
n
Iterando sobre diccionarios
Al iterar sobre un diccionario, por defecto se recorren sus claves:
usuario = {"nombre": "Laura", "edad": 28, "ciudad": "Madrid"}
# Iterando sobre claves
for clave in usuario:
print(f"Clave: {clave}, Valor: {usuario[clave]}")
También podemos usar los métodos items()
, keys()
y values()
:
# Iterando sobre pares clave-valor
for clave, valor in usuario.items():
print(f"{clave}: {valor}")
# Iterando solo sobre valores
for valor in usuario.values():
print(valor)
Comprensiones de listas con for
Las comprensiones de listas son una característica poderosa de Python que permite crear listas de forma concisa usando la sintaxis del bucle for
:
# Crear una lista con los cuadrados de los números del 1 al 5
cuadrados = [x**2 for x in range(1, 6)]
print(cuadrados) # [1, 4, 9, 16, 25]
# Filtrar elementos usando una condición
pares = [x for x in range(10) if x % 2 == 0]
print(pares) # [0, 2, 4, 6, 8]
Bucles for anidados
Podemos anidar bucles for
para trabajar con estructuras de datos multidimensionales:
# Crear una matriz de multiplicación 3x3
for i in range(1, 4):
for j in range(1, 4):
print(f"{i} × {j} = {i*j}", end="\t")
print() # Salto de línea después de cada fila
Resultado:
1 × 1 = 1 1 × 2 = 2 1 × 3 = 3
2 × 1 = 2 2 × 2 = 4 2 × 3 = 6
3 × 1 = 3 3 × 2 = 6 3 × 3 = 9
Casos prácticos
Veamos algunos ejemplos prácticos de uso de bucles for
y range()
:
Ejemplo 1: Calcular la suma de los primeros n números
n = 10
suma = 0
for i in range(1, n+1):
suma += i
print(f"La suma de los primeros {n} números es: {suma}") # 55
Ejemplo 2: Encontrar números primos en un rango
def es_primo(num):
if num < 2:
return False
for i in range(2, int(num**0.5) + 1):
if num % i == 0:
return False
return True
primos = []
for num in range(2, 20):
if es_primo(num):
primos.append(num)
print(f"Números primos entre 2 y 19: {primos}") # [2, 3, 5, 7, 11, 13, 17, 19]
Ejemplo 3: Procesamiento de datos
temperaturas = [22, 19, 24, 25, 21, 23, 20]
dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]
# Encontrar el día más caluroso
max_temp = max(temperaturas)
indice_max = temperaturas.index(max_temp)
print(f"El día más caluroso fue {dias[indice_max]} con {max_temp}°C")
# Calcular la temperatura promedio
promedio = sum(temperaturas) / len(temperaturas)
print(f"Temperatura promedio: {promedio:.1f}°C")
# Días con temperatura superior al promedio
for i in range(len(dias)):
if temperaturas[i] > promedio:
print(f"{dias[i]}: {temperaturas[i]}°C (por encima del promedio)")
Los bucles for
junto con la función range()
son herramientas fundamentales que te permitirán automatizar tareas repetitivas y procesar datos de manera eficiente en tus programas Python.
Bucles while
Los bucles while son estructuras de control que permiten ejecutar un bloque de código repetidamente mientras una condición específica sea verdadera. A diferencia del bucle for
que itera sobre secuencias, el bucle while
se centra en la evaluación de una condición booleana para determinar si continúa ejecutándose.
Sintaxis básica
La estructura de un bucle while
es sencilla pero potente:
while condición:
# Bloque de código a ejecutar
# mientras la condición sea True
El flujo de ejecución es el siguiente:
- Se evalúa la condición
- Si es
True
, se ejecuta el bloque de código - Al terminar el bloque, se vuelve al paso 1
- Si la condición es
False
, se sale del bucle y continúa con el resto del programa
Veamos un ejemplo básico:
contador = 1
while contador <= 5:
print(contador)
contador += 1
Este código imprimirá:
1
2
3
4
5
Cuándo usar while en lugar de for
El bucle while
es especialmente útil en situaciones donde:
- No conocemos de antemano el número exacto de iteraciones
- Necesitamos continuar hasta que ocurra un evento específico
- Queremos implementar un bucle infinito controlado
Por ejemplo, para solicitar entrada al usuario hasta que proporcione un valor válido:
entrada = ""
while not entrada.isdigit():
entrada = input("Introduce un número: ")
print(f"Has introducido el número: {entrada}")
Bucles controlados por eventos
Un uso común de while
es ejecutar código hasta que ocurra un evento específico:
import random
objetivo = random.randint(1, 10)
intentos = 0
adivinado = False
while not adivinado and intentos < 3:
intentos += 1
numero = int(input(f"Intento {intentos}/3: Adivina un número del 1 al 10: "))
if numero == objetivo:
print(f"¡Correcto! Has adivinado en {intentos} intentos.")
adivinado = True
else:
pista = "mayor" if numero < objetivo else "menor"
print(f"Incorrecto. El número es {pista} que {numero}.")
if not adivinado:
print(f"Se acabaron los intentos. El número era {objetivo}.")
Bucles con condición de salida variable
A veces, la condición para continuar o salir del bucle puede cambiar dentro del propio bucle:
saldo = 1000
while saldo > 0:
print(f"Saldo actual: {saldo}€")
gasto = float(input("Introduce la cantidad a gastar (0 para salir): "))
if gasto == 0:
break # Salimos del bucle inmediatamente
if gasto > saldo:
print("No tienes suficiente saldo.")
continue # Volvemos al inicio del bucle
saldo -= gasto
print(f"Saldo final: {saldo}€")
Bucles infinitos controlados
Un bucle infinito es aquel que, en principio, no tiene una condición de salida natural. Se implementa con while True:
y generalmente incluye una condición de salida explícita usando break
:
while True:
respuesta = input("¿Quieres continuar? (s/n): ").lower()
if respuesta == "n":
print("Programa finalizado.")
break
if respuesta == "s":
print("Continuando...")
else:
print("Respuesta no válida. Introduce 's' o 'n'.")
Procesamiento de datos con while
El bucle while
es útil para procesar datos cuando no conocemos la cantidad exacta de elementos:
def calcular_factorial(n):
resultado = 1
while n > 0:
resultado *= n
n -= 1
return resultado
numero = 5
print(f"El factorial de {numero} es {calcular_factorial(numero)}") # 120
Simulaciones y aproximaciones
Los bucles while
son ideales para algoritmos que requieren aproximaciones sucesivas:
def calcular_raiz_cuadrada(numero, precision=0.0001):
aproximacion = numero / 2 # Valor inicial
while abs(aproximacion**2 - numero) > precision:
aproximacion = (aproximacion + numero/aproximacion) / 2
return aproximacion
print(f"Raíz cuadrada de 25: {calcular_raiz_cuadrada(25):.6f}") # 5.000000
print(f"Raíz cuadrada de 7: {calcular_raiz_cuadrada(7):.6f}") # 2.645751
Validación de entrada con while
Un patrón común es usar while
para validar entradas del usuario:
def obtener_numero_en_rango(mensaje, minimo, maximo):
while True:
try:
valor = int(input(mensaje))
if minimo <= valor <= maximo:
return valor
print(f"Error: El número debe estar entre {minimo} y {maximo}.")
except ValueError:
print("Error: Debes introducir un número entero.")
edad = obtener_numero_en_rango("Introduce tu edad (0-120): ", 0, 120)
print(f"Edad registrada: {edad} años")
Patrones con while
Los bucles while
también son útiles para generar patrones:
def imprimir_triangulo(altura):
fila = 1
while fila <= altura:
print("*" * fila)
fila += 1
imprimir_triangulo(5)
Resultado:
*
**
***
****
*****
Consideraciones de rendimiento
Al trabajar con bucles while
, es importante asegurarse de que:
- La condición de salida sea alcanzable
- Las variables de control se actualicen correctamente
- No se produzcan bucles infinitos no deseados
Por ejemplo, este código contiene un error que causa un bucle infinito:
# ¡CUIDADO! Bucle infinito
contador = 1
while contador <= 5:
print(contador)
# Olvidamos incrementar contador
La versión corregida sería:
contador = 1
while contador <= 5:
print(contador)
contador += 1 # Importante: actualizar la variable de control
Comparación con bucles for
Muchos bucles while
pueden reescribirse como bucles for
y viceversa. La elección depende de la claridad y la naturaleza del problema:
# Usando while
suma = 0
i = 1
while i <= 10:
suma += i
i += 1
print(f"Suma (while): {suma}")
# Equivalente con for
suma = 0
for i in range(1, 11):
suma += i
print(f"Suma (for): {suma}")
En general, usa for
cuando conozcas el número de iteraciones y while
cuando la condición de salida dependa de eventos o cálculos dentro del bucle.
break, continue
Las sentencias break y continue son herramientas fundamentales para controlar el flujo de ejecución dentro de bucles en Python. Estas instrucciones permiten alterar el comportamiento normal de los bucles for
y while
, dándote mayor flexibilidad para resolver problemas complejos.
La sentencia break
La instrucción break
permite terminar inmediatamente un bucle, saltándose todas las iteraciones restantes. Cuando Python encuentra un break
, sale del bucle más interno que lo contiene y continúa con el código que sigue después del bucle.
Imagina break
como un "botón de emergencia" que te permite escapar de un bucle cuando se cumple cierta condición:
for numero in range(1, 11):
if numero == 5:
print("¡Encontrado el 5! Saliendo del bucle...")
break
print(f"Número actual: {numero}")
print("Bucle terminado")
Resultado:
Número actual: 1
Número actual: 2
Número actual: 3
Número actual: 4
¡Encontrado el 5! Saliendo del bucle...
Bucle terminado
Observa cómo el bucle se detiene completamente al llegar al 5, sin procesar los números del 6 al 10.
Casos de uso prácticos para break
- Búsqueda eficiente: Detener la búsqueda una vez encontrado el elemento deseado.
def buscar_elemento(lista, objetivo):
for indice, elemento in enumerate(lista):
if elemento == objetivo:
return indice
return -1 # Si llegamos aquí, el elemento no está en la lista
numeros = [4, 7, 2, 9, 1, 5]
posicion = buscar_elemento(numeros, 9)
print(f"El elemento se encuentra en la posición: {posicion}")
- Validación de entrada con salida: Permitir al usuario salir de un proceso de entrada.
while True:
entrada = input("Escribe algo (o 'salir' para terminar): ")
if entrada.lower() == 'salir':
print("Programa terminado.")
break
print(f"Has escrito: {entrada}")
- Optimización de algoritmos: Evitar cálculos innecesarios.
def es_primo(n):
if n < 2:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False # No es primo, salimos inmediatamente
return True # Si llegamos aquí, es primo
La sentencia continue
Mientras que break
termina todo el bucle, continue
salta únicamente la iteración actual y pasa a la siguiente. Es como decir "ignora el resto de esta vuelta y continúa con la siguiente".
for numero in range(1, 11):
if numero % 2 == 0: # Si el número es par
continue # Saltamos a la siguiente iteración
print(f"Número impar: {numero}")
Resultado:
Número impar: 1
Número impar: 3
Número impar: 5
Número impar: 7
Número impar: 9
Observa cómo los números pares (2, 4, 6, 8, 10) no se imprimen porque la instrucción continue
hace que el bucle salte directamente a la siguiente iteración.
Casos de uso prácticos para continue
- Filtrado de datos: Procesar solo los elementos que cumplen cierta condición.
temperaturas = [22, -5, 28, 31, -15, 19, 26, -8]
print("Temperaturas positivas:")
for temp in temperaturas:
if temp <= 0:
continue
print(f"{temp}°C")
- Manejo de casos especiales: Evitar procesar casos que requieren tratamiento diferente.
numeros = [1, 2, 0, 4, 0, 6, 7]
for num in numeros:
if num == 0:
print("Omitiendo división por cero")
continue
resultado = 10 / num
print(f"10 / {num} = {resultado}")
- Validación de datos: Saltar entradas inválidas en un proceso de análisis.
datos = ["25", "error", "42", "texto", "17"]
suma = 0
for valor in datos:
if not valor.isdigit():
print(f"Valor no numérico ignorado: '{valor}'")
continue
suma += int(valor)
print(f"La suma de los valores válidos es: {suma}")
Combinando break y continue
Puedes usar ambas sentencias en el mismo bucle para implementar lógicas más complejas:
numeros = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
limite = 50
suma = 0
for num in numeros:
# Ignoramos múltiplos de 3
if num % 3 == 0:
print(f"Omitiendo {num} (múltiplo de 3)")
continue
# Sumamos el número
suma += num
print(f"Añadiendo {num}: suma = {suma}")
# Si la suma supera el límite, terminamos
if suma > limite:
print(f"Límite de {limite} superado")
break
Uso en bucles anidados
Las sentencias break
y continue
afectan únicamente al bucle más interno que las contiene. Para controlar bucles externos, necesitarás técnicas adicionales:
for i in range(1, 4):
print(f"Grupo {i}:")
for j in range(1, 6):
if j == 3:
print(" Saltando el elemento 3")
continue # Solo afecta al bucle interno
print(f" Elemento {j}")
print("Fin del grupo\n")
Si necesitas salir de múltiples bucles anidados, puedes usar una bandera o variable de control:
encontrado = False
for i in range(5):
for j in range(5):
if i * j > 10:
print(f"Valor encontrado: {i} * {j} = {i*j}")
encontrado = True
break # Sale del bucle interno
if encontrado:
break # Sale del bucle externo
Consideraciones de rendimiento y legibilidad
- Evita bucles complejos: Si tu código tiene muchos
break
ycontinue
, considera refactorizarlo en funciones más pequeñas.
# En lugar de:
for item in lista:
if condicion1(item):
continue
if condicion2(item):
break
# Más código...
# Considera:
def procesar_item(item):
if condicion1(item):
return False
if condicion2(item):
return None
# Procesar y devolver resultado
return resultado
for item in lista:
resultado = procesar_item(item)
if resultado is None:
break
if resultado is False:
continue
# Usar resultado...
- Rendimiento: Usar
break
puede mejorar significativamente el rendimiento al evitar iteraciones innecesarias.
# Versión ineficiente
encontrado = False
for elemento in lista_grande:
if elemento == objetivo:
encontrado = True
# Seguimos recorriendo toda la lista aunque ya encontramos el objetivo
# Versión eficiente
encontrado = False
for elemento in lista_grande:
if elemento == objetivo:
encontrado = True
break # Terminamos inmediatamente
Ejemplos prácticos avanzados
Ejemplo 1: Validación de contraseña
def validar_contraseña(contraseña):
if len(contraseña) < 8:
return False
tiene_mayuscula = False
tiene_minuscula = False
tiene_numero = False
for caracter in contraseña:
if caracter.isupper():
tiene_mayuscula = True
continue # Optimización: ya verificamos este requisito
if caracter.islower():
tiene_minuscula = True
continue
if caracter.isdigit():
tiene_numero = True
return tiene_mayuscula and tiene_minuscula and tiene_numero
# Probamos algunas contraseñas
contraseñas = ["abc123", "Password", "Password1", "pass123", "PASS123"]
for pwd in contraseñas:
if validar_contraseña(pwd):
print(f"'{pwd}' es válida")
else:
print(f"'{pwd}' NO es válida")
Ejemplo 2: Procesamiento de transacciones
transacciones = [
{"id": 1, "monto": 1200, "estado": "completada"},
{"id": 2, "monto": -50, "estado": "error"},
{"id": 3, "monto": 800, "estado": "pendiente"},
{"id": 4, "monto": 1500, "estado": "completada"},
{"id": 5, "monto": 0, "estado": "cancelada"}
]
total_procesado = 0
for t in transacciones:
# Ignoramos transacciones no completadas
if t["estado"] != "completada":
print(f"Transacción {t['id']}: {t['estado']} - ignorada")
continue
# Verificamos montos válidos
if t["monto"] <= 0:
print(f"Transacción {t['id']}: monto inválido ({t['monto']})")
continue
# Procesamos la transacción
total_procesado += t["monto"]
print(f"Transacción {t['id']}: {t['monto']}€ procesada")
print(f"Total procesado: {total_procesado}€")
Las sentencias break
y continue
son herramientas poderosas que, cuando se usan correctamente, pueden hacer que tu código sea más eficiente y legible. Sin embargo, es importante usarlas con moderación para mantener la claridad del flujo de ejecución.
pass y else en bucles
Python ofrece dos características especiales para el control de flujo en bucles que no son comunes en otros lenguajes de programación: la sentencia pass
y la cláusula else
. Estas herramientas proporcionan flexibilidad adicional al trabajar con estructuras iterativas, permitiéndote expresar intenciones de código de manera más clara y elegante.
La sentencia pass
La sentencia pass
es un operador que no hace nada. Funciona como un marcador de posición cuando necesitas sintácticamente una instrucción, pero no quieres ejecutar ningún código. Es especialmente útil en situaciones donde:
- Necesitas crear un bucle vacío
- Estás desarrollando código incrementalmente
- Quieres implementar un patrón de "no operación" explícito
# Bucle que no hace nada para los números pares
for numero in range(1, 10):
if numero % 2 == 0:
pass # No hacemos nada con los números pares
else:
print(f"Procesando número impar: {numero}")
A diferencia de comentarios, pass
es una instrucción real que el intérprete de Python ejecuta (aunque no realiza ninguna operación). Esto lo hace útil como marcador de posición en código que estás desarrollando:
def procesar_datos():
# Función aún no implementada
pass
# El programa puede seguir ejecutándose sin errores
procesar_datos()
En bucles, pass
puede servir para crear estructuras que se activarán condicionalmente:
modo_debug = False
for i in range(100):
# En modo normal, no mostramos nada durante el procesamiento
if not modo_debug:
pass
else:
print(f"Procesando iteración {i}")
# Código de procesamiento real aquí
La cláusula else en bucles
Una característica única de Python es la posibilidad de añadir una cláusula else
a los bucles for
y while
. Esta cláusula se ejecuta una sola vez después de que el bucle haya terminado normalmente (es decir, sin que se haya ejecutado un break
).
La sintaxis es:
for elemento in secuencia:
# Cuerpo del bucle
else:
# Código que se ejecuta si el bucle termina normalmente
O para bucles while
:
while condicion:
# Cuerpo del bucle
else:
# Código que se ejecuta si el bucle termina normalmente
¿Cuándo se ejecuta el else?
- El bloque
else
se ejecuta cuando el bucle ha terminado todas sus iteraciones - No se ejecuta si el bucle termina debido a un
break
- Sí se ejecuta si el bucle no se ejecuta ninguna vez (por ejemplo, si la secuencia está vacía)
Veamos un ejemplo práctico:
# Buscar un número primo en una lista
numeros = [4, 6, 8, 9, 10, 12]
for num in numeros:
if num % 2 != 0 and num % 3 != 0:
print(f"¡Encontrado un primo: {num}!")
break
else:
print("No se encontró ningún número primo en la lista")
En este ejemplo, el bloque else
se ejecuta porque ningún número en la lista cumple la condición para ser primo, por lo que el bucle nunca ejecuta break
.
Comparemos con otro ejemplo donde sí se encuentra un primo:
numeros = [4, 6, 7, 8, 10] # Ahora incluimos el 7
for num in numeros:
if num % 2 != 0 and num % 3 != 0:
print(f"¡Encontrado un primo: {num}!")
break
else:
print("No se encontró ningún número primo en la lista")
En este caso, el bloque else
no se ejecuta porque el bucle termina con break
al encontrar el número 7.
Casos de uso prácticos
Validación con else
El patrón else
en bucles es perfecto para validaciones donde queremos confirmar que todos los elementos cumplen cierta condición:
def validar_edades(lista_edades):
for edad in lista_edades:
if not isinstance(edad, int) or edad < 0:
print(f"Edad inválida encontrada: {edad}")
break
else:
print("Todas las edades son válidas")
return True
return False
# Probamos con diferentes listas
validar_edades([25, 17, 30, 42]) # Todas válidas
validar_edades([25, -3, 30, 42]) # Una inválida
Búsqueda con else
Otro uso común es para búsquedas donde queremos realizar una acción específica si no encontramos lo que buscamos:
def buscar_usuario(usuarios, nombre):
for usuario in usuarios:
if usuario["nombre"] == nombre:
print(f"Usuario encontrado: {usuario}")
return usuario
else:
print(f"Usuario '{nombre}' no encontrado, creando nuevo perfil...")
nuevo_usuario = {"nombre": nombre, "nivel": 1}
usuarios.append(nuevo_usuario)
return nuevo_usuario
base_usuarios = [
{"nombre": "Ana", "nivel": 5},
{"nombre": "Carlos", "nivel": 3}
]
buscar_usuario(base_usuarios, "Ana") # Existente
buscar_usuario(base_usuarios, "Roberto") # Nuevo
Combinando pass y else
Podemos combinar ambas características para crear patrones de control de flujo más sofisticados:
def analizar_datos(valores, umbral):
tiene_advertencias = False
for valor in valores:
if valor > umbral:
tiene_advertencias = True
print(f"Advertencia: valor {valor} excede el umbral {umbral}")
else:
pass # Explícitamente no hacemos nada con valores normales
else:
if not tiene_advertencias:
print("Análisis completo: todos los valores están dentro del rango normal")
return "OK"
return "ADVERTENCIA"
# Probamos con diferentes conjuntos de datos
analizar_datos([10, 15, 20, 25], 30) # Todos dentro del umbral
analizar_datos([10, 35, 20, 25], 30) # Uno excede el umbral
Uso en bucles while
La cláusula else
también funciona con bucles while
, siguiendo la misma lógica:
def encontrar_raiz(numero, max_iteraciones=10):
aproximacion = numero / 2
iteracion = 0
while abs(aproximacion**2 - numero) > 0.001 and iteracion < max_iteraciones:
aproximacion = (aproximacion + numero/aproximacion) / 2
iteracion += 1
print(f"Iteración {iteracion}: {aproximacion:.6f}")
else:
if iteracion < max_iteraciones:
print(f"Convergencia alcanzada en {iteracion} iteraciones")
return aproximacion
print("No se alcanzó convergencia en el número máximo de iteraciones")
return aproximacion
encontrar_raiz(25) # Debería converger rápidamente
encontrar_raiz(612, 5) # Probablemente no converja en 5 iteraciones
Consideraciones de estilo y legibilidad
Aunque pass
y else
en bucles son características poderosas, es importante usarlas con moderación para mantener la legibilidad del código:
- Usa
pass
cuando quieras indicar explícitamente que "no hacer nada" es intencional - La cláusula
else
en bucles puede ser confusa para programadores que vienen de otros lenguajes, así que considera añadir un comentario explicativo - En equipos de desarrollo, asegúrate de que todos entiendan estas construcciones
# Versión más explícita con comentarios
for item in coleccion:
if condicion(item):
# Procesamiento normal
procesar(item)
else:
pass # Intencionalmente no hacemos nada con estos elementos
else:
# Este bloque se ejecuta si el bucle termina normalmente (sin break)
print("Procesamiento completado sin interrupciones")
Ejemplo integrado: Sistema de validación
Veamos un ejemplo más completo que integra pass
y else
en un sistema de validación de formularios:
def validar_formulario(datos):
campos_requeridos = ["nombre", "email", "edad"]
errores = []
# Verificar campos requeridos
for campo in campos_requeridos:
if campo not in datos:
errores.append(f"Falta el campo requerido: {campo}")
break
elif not datos[campo]: # Campo vacío
errores.append(f"El campo {campo} no puede estar vacío")
break
else:
# Solo llegamos aquí si todos los campos requeridos existen y no están vacíos
# Ahora validamos el formato de cada campo
# Validar email
if "@" not in datos["email"]:
errores.append("Email inválido")
# Validar edad
try:
edad = int(datos["edad"])
if edad < 18 or edad > 120:
errores.append("La edad debe estar entre 18 y 120")
except ValueError:
errores.append("La edad debe ser un número")
# Validaciones opcionales
if "telefono" in datos:
if not datos["telefono"].isdigit():
errores.append("El teléfono debe contener solo dígitos")
else:
pass # Explícitamente indicamos que es opcional
# Resultado final
if errores:
return {"valido": False, "errores": errores}
else:
return {"valido": True}
# Probamos con diferentes formularios
formulario1 = {
"nombre": "Ana García",
"email": "ana@ejemplo.com",
"edad": "28"
}
formulario2 = {
"nombre": "Carlos López",
"email": "carlosejemplo.com", # Falta @
"edad": "17" # Menor de edad
}
print(validar_formulario(formulario1))
print(validar_formulario(formulario2))
Este ejemplo muestra cómo pass
y else
pueden contribuir a un código más expresivo y estructurado, permitiéndote implementar lógicas complejas de validación de manera clara y mantenible.
La combinación de estas características con las demás estructuras de control iterativo que hemos visto (for
, while
, break
, continue
) te proporciona un conjunto completo de herramientas para resolver prácticamente cualquier problema de programación que requiera repetición y control de flujo.
Ejercicios de esta lección Estructuras control iterativo
Evalúa tus conocimientos de esta lección Estructuras control iterativo con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.
Módulo math
Reto herencia
Excepciones
Introducción a Python
Reto variables
Funciones Python
Reto funciones
Módulo datetime
Reto acumulación
Reto estructuras condicionales
Polimorfismo
Módulo os
Reto métodos dunder
Diccionarios
Reto clases y objetos
Reto operadores
Operadores
Estructuras de control
Funciones lambda
Reto diccionarios
Reto función lambda
Encapsulación
Reto coleciones
Reto funciones auxiliares
Crear módulos y paquetes
Módulo datetime
Excepciones
Operadores
Diccionarios
Reto map, filter
Reto tuplas
Proyecto gestor de tareas CRUD
Tuplas
Variables
Tipos de datos
Conjuntos
Reto mixins
Módulo csv
Módulo json
Herencia
Análisis de datos de ventas con Pandas
Reto fechas y tiempo
Reto estructuras de iteración
Funciones
Reto comprehensions
Variables
Reto serialización
Módulo csv
Reto polimorfismo
Polimorfismo
Clases y objetos
Reto encapsulación
Estructuras de control
Importar módulos y paquetes
Módulo math
Funciones lambda
Reto excepciones
Listas
Reto archivos
Encapsulación
Reto conjuntos
Clases y objetos
Instalación de Python y creación de proyecto
Reto listas
Tipos de datos
Crear módulos y paquetes
Tuplas
Herencia
Reto acceso a sistema
Proyecto sintaxis calculadora
Importar módulos y paquetes
Clases y objetos
Módulo os
Listas
Conjuntos
Reto tipos de datos
Reto matemáticas
Módulo json
Todas las lecciones de Python
Accede a todas las lecciones de Python y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Introducción A Python
Introducción
Instalación Y Creación De Proyecto
Introducción
Tema 2: Tipos De Datos, Variables Y Operadores
Introducción
Instalación De Python
Introducción
Tipos De Datos
Sintaxis
Variables
Sintaxis
Operadores
Sintaxis
Estructuras De Control
Sintaxis
Funciones
Sintaxis
Estructuras Control Iterativo
Sintaxis
Estructuras Control Condicional
Sintaxis
Testing Con Pytest
Sintaxis
Listas
Estructuras De Datos
Tuplas
Estructuras De Datos
Diccionarios
Estructuras De Datos
Conjuntos
Estructuras De Datos
Comprehensions
Estructuras De Datos
Clases Y Objetos
Programación Orientada A Objetos
Excepciones
Programación Orientada A Objetos
Encapsulación
Programación Orientada A Objetos
Herencia
Programación Orientada A Objetos
Polimorfismo
Programación Orientada A Objetos
Mixins Y Herencia Múltiple
Programación Orientada A Objetos
Métodos Especiales (Dunder Methods)
Programación Orientada A Objetos
Composición De Clases
Programación Orientada A Objetos
Funciones Lambda
Programación Funcional
Aplicación Parcial
Programación Funcional
Entrada Y Salida, Manejo De Archivos
Programación Funcional
Decoradores
Programación Funcional
Generadores
Programación Funcional
Paradigma Funcional
Programación Funcional
Composición De Funciones
Programación Funcional
Funciones Orden Superior Map Y Filter
Programación Funcional
Funciones Auxiliares
Programación Funcional
Reducción Y Acumulación
Programación Funcional
Archivos Comprimidos
Entrada Y Salida Io
Entrada Y Salida Avanzada
Entrada Y Salida Io
Archivos Temporales
Entrada Y Salida Io
Contexto With
Entrada Y Salida Io
Módulo Csv
Biblioteca Estándar
Módulo Json
Biblioteca Estándar
Módulo Datetime
Biblioteca Estándar
Módulo Math
Biblioteca Estándar
Módulo Os
Biblioteca Estándar
Módulo Re
Biblioteca Estándar
Módulo Random
Biblioteca Estándar
Módulo Time
Biblioteca Estándar
Módulo Collections
Biblioteca Estándar
Módulo Sys
Biblioteca Estándar
Módulo Statistics
Biblioteca Estándar
Módulo Pickle
Biblioteca Estándar
Módulo Pathlib
Biblioteca Estándar
Importar Módulos Y Paquetes
Paquetes Y Módulos
Crear Módulos Y Paquetes
Paquetes Y Módulos
Entornos Virtuales (Virtualenv, Venv)
Entorno Y Dependencias
Gestión De Dependencias (Pip, Requirements.txt)
Entorno Y Dependencias
Python-dotenv Y Variables De Entorno
Entorno Y Dependencias
Acceso A Datos Con Mysql, Pymongo Y Pandas
Acceso A Bases De Datos
Acceso A Mongodb Con Pymongo
Acceso A Bases De Datos
Acceso A Mysql Con Mysql Connector
Acceso A Bases De Datos
Novedades Python 3.13
Características Modernas
Operador Walrus
Características Modernas
Pattern Matching
Características Modernas
Instalación Beautiful Soup
Web Scraping
Sintaxis General De Beautiful Soup
Web Scraping
Tipos De Selectores
Web Scraping
Web Scraping De Html
Web Scraping
Web Scraping Para Ciencia De Datos
Web Scraping
Autenticación Y Acceso A Recursos Protegidos
Web Scraping
Combinación De Selenium Con Beautiful Soup
Web Scraping
En esta lección
Objetivos de aprendizaje de esta lección
- Comprender y utilizar bucles for para iterar sobre secuencias, rangos, cadenas y diccionarios.
- Aplicar la función range() para controlar iteraciones numéricas y anidar bucles.
- Implementar bucles while para ejecutar código basado en condiciones dinámicas y eventos.
- Controlar el flujo de bucles con las sentencias break y continue para optimizar y gestionar iteraciones.
- Utilizar las sentencias pass y la cláusula else en bucles para mejorar la legibilidad y control del código.