Python

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ícate

Bucles 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:

  1. Se evalúa la condición
  2. Si es True, se ejecuta el bloque de código
  3. Al terminar el bloque, se vuelve al paso 1
  4. 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 y continue, 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.

CONSTRUYE TU CARRERA EN IA Y PROGRAMACIÓN SOFTWARE

Accede a +1000 lecciones y cursos con certificado. Mejora tu portfolio con certificados de superación para tu CV.

30 % DE DESCUENTO

Plan mensual

19.00 /mes

13.30 € /mes

Precio normal mensual: 19 €
63 % DE DESCUENTO

Plan anual

10.00 /mes

7.00 € /mes

Ahorras 144 € al año
Precio normal anual: 120 €
Aprende Python online

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

Python
Puzzle

Reto herencia

Python
Código

Excepciones

Python
Test

Introducción a Python

Python
Test

Reto variables

Python
Código

Funciones Python

Python
Puzzle

Reto funciones

Python
Código

Módulo datetime

Python
Test

Reto acumulación

Python
Código

Reto estructuras condicionales

Python
Código

Polimorfismo

Python
Test

Módulo os

Python
Test

Reto métodos dunder

Python
Código

Diccionarios

Python
Puzzle

Reto clases y objetos

Python
Código

Reto operadores

Python
Código

Operadores

Python
Test

Estructuras de control

Python
Puzzle

Funciones lambda

Python
Test

Reto diccionarios

Python
Código

Reto función lambda

Python
Código

Encapsulación

Python
Puzzle

Reto coleciones

Python
Proyecto

Reto funciones auxiliares

Python
Código

Crear módulos y paquetes

Python
Puzzle

Módulo datetime

Python
Puzzle

Excepciones

Python
Puzzle

Operadores

Python
Puzzle

Diccionarios

Python
Test

Reto map, filter

Python
Código

Reto tuplas

Python
Código

Proyecto gestor de tareas CRUD

Python
Proyecto

Tuplas

Python
Puzzle

Variables

Python
Puzzle

Tipos de datos

Python
Puzzle

Conjuntos

Python
Test

Reto mixins

Python
Código

Módulo csv

Python
Test

Módulo json

Python
Test

Herencia

Python
Test

Análisis de datos de ventas con Pandas

Python
Proyecto

Reto fechas y tiempo

Python
Proyecto

Reto estructuras de iteración

Python
Código

Funciones

Python
Test

Reto comprehensions

Python
Código

Variables

Python
Test

Reto serialización

Python
Proyecto

Módulo csv

Python
Puzzle

Reto polimorfismo

Python
Código

Polimorfismo

Python
Puzzle

Clases y objetos

Python
Código

Reto encapsulación

Python
Código

Estructuras de control

Python
Test

Importar módulos y paquetes

Python
Test

Módulo math

Python
Test

Funciones lambda

Python
Puzzle

Reto excepciones

Python
Código

Listas

Python
Puzzle

Reto archivos

Python
Proyecto

Encapsulación

Python
Test

Reto conjuntos

Python
Código

Clases y objetos

Python
Test

Instalación de Python y creación de proyecto

Python
Test

Reto listas

Python
Código

Tipos de datos

Python
Test

Crear módulos y paquetes

Python
Test

Tuplas

Python
Test

Herencia

Python
Puzzle

Reto acceso a sistema

Python
Proyecto

Proyecto sintaxis calculadora

Python
Proyecto

Importar módulos y paquetes

Python
Puzzle

Clases y objetos

Python
Puzzle

Módulo os

Python
Puzzle

Listas

Python
Test

Conjuntos

Python
Puzzle

Reto tipos de datos

Python
Código

Reto matemáticas

Python
Proyecto

Módulo json

Python
Puzzle

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

Python

Introducción

Instalación Y Creación De Proyecto

Python

Introducción

Tema 2: Tipos De Datos, Variables Y Operadores

Python

Introducción

Instalación De Python

Python

Introducción

Tipos De Datos

Python

Sintaxis

Variables

Python

Sintaxis

Operadores

Python

Sintaxis

Estructuras De Control

Python

Sintaxis

Funciones

Python

Sintaxis

Estructuras Control Iterativo

Python

Sintaxis

Estructuras Control Condicional

Python

Sintaxis

Testing Con Pytest

Python

Sintaxis

Listas

Python

Estructuras De Datos

Tuplas

Python

Estructuras De Datos

Diccionarios

Python

Estructuras De Datos

Conjuntos

Python

Estructuras De Datos

Comprehensions

Python

Estructuras De Datos

Clases Y Objetos

Python

Programación Orientada A Objetos

Excepciones

Python

Programación Orientada A Objetos

Encapsulación

Python

Programación Orientada A Objetos

Herencia

Python

Programación Orientada A Objetos

Polimorfismo

Python

Programación Orientada A Objetos

Mixins Y Herencia Múltiple

Python

Programación Orientada A Objetos

Métodos Especiales (Dunder Methods)

Python

Programación Orientada A Objetos

Composición De Clases

Python

Programación Orientada A Objetos

Funciones Lambda

Python

Programación Funcional

Aplicación Parcial

Python

Programación Funcional

Entrada Y Salida, Manejo De Archivos

Python

Programación Funcional

Decoradores

Python

Programación Funcional

Generadores

Python

Programación Funcional

Paradigma Funcional

Python

Programación Funcional

Composición De Funciones

Python

Programación Funcional

Funciones Orden Superior Map Y Filter

Python

Programación Funcional

Funciones Auxiliares

Python

Programación Funcional

Reducción Y Acumulación

Python

Programación Funcional

Archivos Comprimidos

Python

Entrada Y Salida Io

Entrada Y Salida Avanzada

Python

Entrada Y Salida Io

Archivos Temporales

Python

Entrada Y Salida Io

Contexto With

Python

Entrada Y Salida Io

Módulo Csv

Python

Biblioteca Estándar

Módulo Json

Python

Biblioteca Estándar

Módulo Datetime

Python

Biblioteca Estándar

Módulo Math

Python

Biblioteca Estándar

Módulo Os

Python

Biblioteca Estándar

Módulo Re

Python

Biblioteca Estándar

Módulo Random

Python

Biblioteca Estándar

Módulo Time

Python

Biblioteca Estándar

Módulo Collections

Python

Biblioteca Estándar

Módulo Sys

Python

Biblioteca Estándar

Módulo Statistics

Python

Biblioteca Estándar

Módulo Pickle

Python

Biblioteca Estándar

Módulo Pathlib

Python

Biblioteca Estándar

Importar Módulos Y Paquetes

Python

Paquetes Y Módulos

Crear Módulos Y Paquetes

Python

Paquetes Y Módulos

Entornos Virtuales (Virtualenv, Venv)

Python

Entorno Y Dependencias

Gestión De Dependencias (Pip, Requirements.txt)

Python

Entorno Y Dependencias

Python-dotenv Y Variables De Entorno

Python

Entorno Y Dependencias

Acceso A Datos Con Mysql, Pymongo Y Pandas

Python

Acceso A Bases De Datos

Acceso A Mongodb Con Pymongo

Python

Acceso A Bases De Datos

Acceso A Mysql Con Mysql Connector

Python

Acceso A Bases De Datos

Novedades Python 3.13

Python

Características Modernas

Operador Walrus

Python

Características Modernas

Pattern Matching

Python

Características Modernas

Instalación Beautiful Soup

Python

Web Scraping

Sintaxis General De Beautiful Soup

Python

Web Scraping

Tipos De Selectores

Python

Web Scraping

Web Scraping De Html

Python

Web Scraping

Web Scraping Para Ciencia De Datos

Python

Web Scraping

Autenticación Y Acceso A Recursos Protegidos

Python

Web Scraping

Combinación De Selenium Con Beautiful Soup

Python

Web Scraping

Accede GRATIS a Python y certifícate

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.