Implementación azul-verde versus implementación canaria: diferencias, compensaciones y cómo elegir

  1. Inicio
  2. Blog
  3. DevOps

DevOps

Implementación azul-verde versus implementación canaria: Diferencias, compensaciones y cómo elegir

Ambas estrategias le permiten publicar sin cerrar el sitio, pero gestionan el riesgo de maneras opuestas. Conoce cómo funciona cada uno, cuánto cuesta realmente, cómo manejar la base de datos y cuál se adapta a tu equipo.

9 min de lectura
Implementación azul-verde vs canario: diferencias, compensaciones y cómo elegir

Puntos clave

  • Azul-verde mantiene dos entornos completos y cambia todo el tráfico a la vez.
  • Canary envía la nueva versión primero a una pequeña parte de usuarios y luego la expande gradualmente.
  • El azul-verde ofrece una reversión muy rápida. Canary limita a cuántos usuarios puede afectar una versión incorrecta.
  • Ambos dependen de cambios en la base de datos compatibles con versiones anteriores y de un buen seguimiento.

Lanzar software solía significar una ventana de mantenimiento y dedos cruzados. Los equipos modernos utilizan estrategias que hacen que los lanzamientos sean rutinarios, y la opción implementación azul-verde versus implementación canaria es una de las primeras a las que se enfrentará. Ambos reducen el riesgo, pero lo hacen de maneras opuestas: uno prepara un reemplazo completo, mientras que el otro prueba con usuarios reales poco a poco.

Esta guía explica cómo funciona cada uno y cuánto cuesta en la práctica. Ejecutamos los pequeños ejemplos de enrutamiento de usuarios y reversión en Python 3.13, y el resultado proviene de esa ejecución. Los ejemplos de Kubernetes son ilustrativos y no los ejecutamos. Trate los porcentajes y umbrales como ejemplos iniciales para adaptarse.

La respuesta corta

Con la implementación azul-verde, ejecuta dos entornos de producción idénticos. Uno atiende a los usuarios mientras usted implementa y prueba la nueva versión en el otro, y luego cambia todo el tráfico en un solo movimiento.

Con la implementación canary, la nueva versión se ejecuta junto a la anterior. Le envía un pequeño porcentaje de tráfico real, compara los resultados y aumenta la participación paso a paso hasta que sirva a todos. El nombre proviene de los mineros canarios que alguna vez utilizaron como alerta temprana de peligro.

Azul-verde vs canario uno al lado del otro

Aspecto Azul verdoso canario
Cambio de tráfico todos a la vez Gradual
Usuarios expuestos a una mala versión Todo, hasta que vuelvas a cambiar. Sólo el canario comparte
Revertir Cambiar el tráfico nuevamente Establecer el canary share a cero
Velocidad de liberación transición rápida Más lento, por etapas
Costo de infraestructura Hasta el doble durante el lanzamiento Una pequeña parte extra
Se necesita enrutamiento del tráfico Un simple interruptor Enrutamiento basado en porcentaje
Monitoreo necesario bueno Excelente, con métricas por versión.
Las versiones conviven Brevemente, en todo caso Para todo el lanzamiento
Comentarios de usuarios reales antes del lanzamiento completo No si

Cómo funciona la implementación azul-verde

  1. Blue está activo y atiende a todo el tráfico.
  2. Implemente la nueva versión en verde, que no recibe tráfico de usuarios.
  3. Realice pruebas ecológicas exhaustivas, en el entorno de producción real, mediante pruebas de humo y usuarios internos.
  4. Cambie el enrutador, el equilibrador de carga o el DNS para enviar el tráfico a verde.
  5. Observe de cerca, con el azul aún funcionando y listo.
  6. Si algo anda mal, vuelva a cambiar. Si todo va bien, el azul se convierte en el siguiente entorno inactivo.

En Kubernetes, puedes hacer el cambio cambiando el selector de un Servicio, de modo que el tráfico se mueva a Pods etiquetados de manera diferente:

apiVersion: v1
kind: Service
metadata:
  name: shop
spec:
  selector:
    app: shop
    version: green   # was: blue
  ports:
    - port: 80
      targetPort: 8000

Fortalezas: Es conceptualmente simple, puedes probar la configuración de producción exacta antes de que los usuarios la vean y la reversión es casi instantánea. Debilidades: La infraestructura duplicada puede ser costosa, un error que pasa desapercibido en las pruebas llega a todos a la vez, y las sesiones abiertas y el trabajo en vuelo necesitan atención durante el cambio. Si utiliza DNS para el cambio, los registros almacenados en caché pueden retrasarlo. ¿Nuevo en los conceptos? Consulte nuestro tutorial de Kubernetes para principiantes.

Cómo funciona la implementación canaria

  1. Implemente la nueva versión junto con la estable.
  2. Dirigir una pequeña parte del tráfico, por ejemplo el 5%, hacia Canarias.
  3. Compare tasas de error, latencia y métricas comerciales con la versión estable.
  4. Si está sano, aumente al 25%, luego al 50% y luego al 100%.
  5. Si algo se degrada, envíe todo el tráfico a la versión estable.

Muchos equipos inician un canario con personal interno, luego una región de bajo riesgo y solo después con el público en general.

Fortalezas: Una mala versión afecta solo a un grupo pequeño, y del tráfico real se aprende que ningún entorno de prueba puede reproducir completamente. Debilidades: Necesita enrutamiento basado en porcentajes y métricas por versión, las implementaciones toman más tiempo y dos versiones se ejecutan juntas por un tiempo. Un canario pequeño también puede ser demasiado silencioso para dar una señal significativa, especialmente en momentos de poco tráfico.

Enrutamiento de usuarios estable

Elegir una versión al azar en cada solicitud brinda a los usuarios una experiencia confusa, ya que pueden oscilar entre la antigua y la nueva. Una solución común es convertir una ID de usuario estable en un depósito, de modo que cada usuario siempre obtenga la misma respuesta:

import hashlib

def bucket(user_id):
    digest = hashlib.sha256(user_id.encode()).hexdigest()
    return int(digest, 16) % 100

def version_for(user_id, canary_percent):
    return "v2" if bucket(user_id) < canary_percent else "v1"

users = [f"user-{i}" for i in range(10000)]
for percent in (5, 25, 50, 100):
    share = sum(version_for(u, percent) == "v2" for u in users) / len(users)
    print(percent, round(share * 100, 1))

# 5 5.0
# 25 24.5
# 50 49.9
# 100 100.0

La proporción real siguió de cerca el objetivo. Este método tiene dos propiedades útiles más y nuestra ejecución confirmó ambas. El mismo usuario siempre recibía la misma versión. Y todos los que estaban en el grupo del 5% todavía estaban incluidos en el 25%, por lo que nadie que ya tenía la nueva versión fue movido hacia atrás a medida que crecía el lanzamiento.

En sistemas reales, una malla de servicios, un balanceador de carga o una herramienta como Argo Rollouts o Flagger generalmente maneja este enrutamiento, por lo que no es necesario que lo escriba usted mismo. Sigue siendo útil comprender lo que están haciendo.

Automatizando la decisión

Un canario sólo funciona si alguien realmente está comparando las versiones. Los controles automatizados son más confiables que una persona mirando gráficos. Aquí está la idea central, comparar la tasa de error del canary con la de la versión estable:

def should_rollback(canary_errors, canary_total, base_errors, base_total,
                    tolerance=1.5, min_requests=500):
    if canary_total < min_requests:
        return False   # not enough data to decide
    return (canary_errors / canary_total) > (base_errors / base_total) * tolerance

should_rollback(3, 100, 10, 5000)        # False: too few requests
should_rollback(30, 1000, 100, 10000)    # True:  3% against 1%
should_rollback(12, 1000, 100, 10000)    # False: 1.2% is within tolerance

Nótese el primer caso. Su tasa de error parece alta, pero con sólo 100 solicitudes, aún no es evidencia suficiente. Las herramientas reales aplican estadísticas más cuidadosas y analizan varias señales juntas:

señal Ejemplo
Errores Tasa de 5xx respuestas
Latencia p95 y p99, como se explica en pruebas de carga frente a pruebas de estrés
Saturación CPU, memoria, grupos de conexiones
Negocios Registros, pagos, pago exitoso

Consejo: Compare el valor canario con la versión estable durante el mismo período de tiempo, en lugar de con las cifras de la semana pasada. El tráfico y el comportamiento cambian cada hora, por lo que una comparación lado a lado le brinda una señal mucho más justa.

El problema de la base de datos

El código de la aplicación se puede intercambiar en segundos, pero los datos no. Ambas estrategias suelen compartir una base de datos, por lo que durante una implementación y después de una reversión, las versiones antigua y nueva deben funcionar con el mismo esquema.

La respuesta estándar es el patrón expandir y contraer. Supongamos que desea cambiar el nombre de name a full_name:

  1. Expandir: agrega la nueva columna. El código antiguo no se ve afectado.
  2. Migrar: código de lanzamiento que escribe en ambas columnas y rellena las filas antiguas.
  3. Switch: código de versión que se lee en la nueva columna.
  4. Contrato: una vez que nada use la columna anterior, elimínela en una versión posterior.

Esto requiere varias versiones, pero cada paso se puede revertir de forma segura. Ejecutar RENAME COLUMN de una vez rompería cualquier versión que esperara el otro nombre. Tenga cuidado también con los cambios de esquema de larga duración, porque pueden contener bloqueos. Para obtener más información sobre esto, lea sobre transacciones SQL.

Rolling y otras estrategias

Estrategia como funciona Bueno para
recrear Deje lo viejo y luego comience lo nuevo, con tiempo de inactividad Herramientas internas, sistemas por lotes.
rodando Reemplazar instancias unas pocas a la vez Un valor predeterminado común, incluso en Kubernetes
Azul verdoso Cambiar entre dos entornos Transición y reversión rápidas
canario Ampliar una pequeña parte gradualmente Alto tráfico, alto riesgo.
sombra Copie el tráfico a la nueva versión y descarte sus respuestas. Pruebas con carga real, sin impacto en el usuario

Una implementación de Kubernetes realiza una actualización continua de forma predeterminada, lo que se adapta a muchos servicios. Una actualización continua también cambia gradualmente, pero su participación está ligada a la cantidad de instancias y no analiza por sí sola los resultados ni se detiene ante métricas incorrectas.

¿Qué pasa con las banderas de funciones?

La implementación coloca código en los servidores y lanzamiento pone una función a disposición de los usuarios. Los indicadores de funciones los mantienen separados, al permitirle activar una función para los usuarios elegidos sin implementar nada. Funcionan muy bien con ambas estrategias: implementar con la bandera apagada y luego habilitarla gradualmente. No reemplazan estas estrategias, ya que una bandera no puede protegerlo de una versión que falla al iniciar. Recuerde eliminar las banderas antiguas, ya que se acumulan como deuda técnica.

como elegir

tu situacion Elección razonable
Aplicación sencilla y pocos usuarios. Actualización continua
Necesita una transición y una reversión muy rápidas Azul verdoso
Quiere realizar pruebas en producción antes del cambio. Azul verdoso
Alto tráfico y un alto costo de falla canario
Monitoreo sólido y métricas por versión canario
Poco tráfico Azul-verde, ya que las señales canarias son demasiado débiles
Presupuesto de infraestructura ajustado Canario o rodante

También se pueden combinar. Algunos equipos implementan un entorno ecológico y luego trasladan el tráfico hacia él gradualmente, obteniendo un entorno limpio y un radio de explosión limitado. Elija lo que elija, automaticelo a través de su canal de CI/CD, como explica nuestra guía de Acciones de GitHub.

Errores comunes

  • Realizar cambios importantes en el esquema. La reversión no ayuda si el código anterior no puede leer los datos.
  • Sin criterios de reversión. Decida qué significa “malo” antes de que comience la publicación, no durante un incidente.
  • Dejar que los entornos fluyan. Si el verde difiere del azul, tus pruebas resultan menos. Defina ambos con infraestructura como código.
  • Midiendo solo métricas técnicas. Una versión puede estar libre de errores y aún así interrumpir el pago.
  • Nunca practiques la reversión. Ensáyalo para que funcione cuando estés bajo presión.
  • Olvidar trabajos en segundo plano. Los trabajadores y las tareas programadas también necesitan un plan durante un cambio.

Conclusión

El azul verdoso te ofrece un cambio limpio y rápido. Canary te ofrece una exposición pequeña y medida. Si su monitoreo aún es básico, comience con actualizaciones continuas o azul-verde e invierta en métricas por versión antes de probar canaries. Luego, ensaye una reversión en su próxima versión, incluida la base de datos. Ese único ejercicio tiende a revelar lo que realmente necesita arreglarse.

Preguntas frecuentes

¿Cuál es la diferencia entre el despliegue azul-verde y canario?

Azul-verde cambia todo el tráfico de un entorno completo a otro a la vez. Canary envía una pequeña parte del tráfico a la nueva versión y la expande gradualmente.

¿Cuál es más seguro, el azul verdoso o el canario?

Canary limita a cuántos usuarios afecta una versión incorrecta y el azul-verde ofrece una reversión muy rápida. La elección más segura depende de su tráfico, herramientas y monitoreo.

¿Es caro el despliegue azul-verde?

Puede serlo, ya que puede ejecutar dos entornos completos durante un lanzamiento. El escalado automático de la nube y el cierre del entorno inactivo pueden reducir el costo.

¿Con qué porcentaje debería empezar un canario?

Los equipos suelen comenzar con entre el 1 y el 5 por ciento, siempre que eso proporcione suficiente tráfico para una señal significativa. Los sistemas con poco tráfico pueden necesitar una proporción mayor.

¿Cómo manejan canario y azul-verde los cambios en la base de datos?

Generalmente con cambios compatibles con versiones anteriores, como expandir y contraer, porque ambas versiones pueden compartir una base de datos y ambas deben funcionar durante la implementación.

sigue aprendiendo

Trabajar con Stack Quora

¿Necesitas ayuda con pruebas, WordPress o SEO?

Ayudamos a los equipos a enviar mejor software y hacer crecer sus sitios. Cuéntenos en qué está trabajando y le sugeriremos un siguiente paso claro.

Sigue leyendo

Más guías sobre testing, IA y desarrollo moderno

¿Te gustó este artículo? Elige un tema y salta directo a nuestros tutoriales más recientes.

Inteligencia artificial

Explicación de las alucinaciones de la IA: por qué los modelos de lenguaje inventan cosas y cómo reducirlas

Se explicaron las alucinaciones de la IA: qué son, por qué los modelos de lenguaje las producen, tipos comunes, cómo reducirlas con conexión a tierr…

Leer artículo →
DevOps

Explicación de las variables de entorno: archivos .env, secretos y configuración bien hechos

Variables de entorno explicadas con ejemplos de Python que ejecutamos: leerlas y configurarlas, por qué cada valor es una cadena, archivos .env, her…

Leer artículo →
Desarrollo de software

Explicación de la limitación de velocidad de API: algoritmos, encabezados y manejo de errores 429

La limitación de la tasa de API se explica con una simulación que ejecutamos: depósito de tokens, ventana fija, ventana deslizante, 429 respuestas, …

Leer artículo →
Automatización de pruebas

Burlarse en Python: unittest.mock, patch y los errores que hacen que las pruebas mientan

Burlarse en Python con unittest.mock, probado: Mock y return_value, side_effect, parches donde se usa un nombre, especificación y autospec, fechas d…

Leer artículo →
Pruebas de software

Explicación de la cobertura del código: cobertura de línea versus sucursal y lo que realmente significa 100%

Cobertura del código explicada con una ejecución real de cobertura.py: cobertura de línea, rama y condición, lectura de un informe, por qué una cobe…

Leer artículo →
Bases de datos y SQL

DELETE vs TRUNCATE vs DROP en SQL: diferencias, reversión y cuándo usar cada uno

DELETE vs TRUNCATE vs DROP explicado con SQL probado: qué elimina cada uno, reversión, activadores, restablecimiento de identidad, velocidad y en qu…

Leer artículo →
Bases de datos y SQL

Vistas SQL explicadas: cree, use y evite los errores, con ejemplos

Vistas SQL explicadas con consultas que ejecutamos: creación de una vista, resultados en vivo, ocultación de columnas, rendimiento, vistas actualiza…

Leer artículo →
Desarrollo de software

Interfaz TypeScript versus tipo: diferencias reales, probadas con el compilador

Interfaz TypeScript versus tipo, verificado con el compilador real: qué pueden hacer ambos, qué puede hacer solo uno, fusión de declaraciones, exten…

Leer artículo →
Desarrollo de software

Python *args y **kwargs explicados: funciones flexibles con ejemplos claros

Python *args y **kwargs explicados con el código que ejecutamos: empaquetado y desempaquetado, orden de parámetros, argumentos solo de palabras clav…

Leer artículo →
Desarrollo de software

Funciones Lambda de Python: sintaxis, usos reales y cuándo no utilizarlas

Funciones lambda de Python explicadas con el código que ejecutamos: sintaxis, clasificación con clave, mapa y filtro, cierres, trampa de enlace tard…

Leer artículo →
Inteligencia artificial

¿Qué son los agentes de IA? Cómo funcionan, con un bucle de agente simple que puedes ejecutar

¿Qué son los agentes de IA? Una guía sencilla sobre el bucle del agente, las herramientas, la memoria y las barreras de seguridad, con un pequeño bu…

Leer artículo →
DevOps

Monitoreo versus observabilidad: la verdadera diferencia, con registros, métricas y seguimientos

Explicación del monitoreo versus observabilidad: fallas conocidas y desconocidas, registros, métricas y seguimientos, un recorrido por incidentes de…

Leer artículo →
DevOps

Docker Volumes versus Bind Mounts: persistir los datos del contenedor de la manera correcta

Se explican los volúmenes de Docker frente a los montajes de enlace: por qué desaparecen los datos del contenedor, volúmenes con nombre, montajes de…

Leer artículo →
Automatización de pruebas

TDD vs BDD: diferencias clave, una función creada en ambos sentidos y cuándo usar cada una

TDD vs BDD explicado con una característica de descuento construida en ambos sentidos: refactor rojo-verde con el código que ejecutamos, escenarios …

Leer artículo →
Pruebas de software

Pruebas de Aceptación de Usuario (UAT): Proceso, Lista de Verificación y Ejemplos Reales

Explicación de las pruebas de aceptación del usuario: quién las ejecuta, en qué se diferencia del control de calidad, un proceso de siete pasos, una…

Leer artículo →
Bases de datos y SQL

Valores NULL de SQL explicados: IS NULL, COALESCE, NULLIF y las trampas que se deben evitar

Los valores NULL de SQL se explican con las consultas que ejecutamos: lógica de tres valores, IS NULL, COALESCE, NULLIF, cómo los agregados, las uni…

Leer artículo →
Bases de datos y SQL

Declaración SQL CASE WHEN: sintaxis, ejemplos reales y errores comunes

CASO SQL CUANDO se explicó con las consultas que ejecutamos: formularios simples y buscados, orden de condiciones, pivotes con SUMA, trucos COUNT, c…

Leer artículo →
Desarrollo de software

¿Qué es JWT? Tokens web JSON explicados con un ejemplo práctico

¿Qué es JWT? JSON Web Tokens explicó: las tres partes, un token creado y manipulado en el código que ejecutamos, JWT vs sesiones, almacenamiento, to…

Leer artículo →
Desarrollo de software

Explicación del bucle de eventos de JavaScript: pila de llamadas, microtareas y temporizadores con ejemplos

El bucle de eventos de JavaScript explicado con el código que ejecutamos: pila de llamadas, colas de tareas y microtareas, por qué setTimeout 0 no e…

Leer artículo →
Desarrollo de software

Explicación de los generadores y el rendimiento de Python: ahorre memoria con ejemplos reales

Los generadores de Python y el rendimiento se explican con el código que ejecutamos: cómo se pausan y reanudan, midieron el ahorro de memoria, canal…

Leer artículo →
Inteligencia artificial

¿Qué son las incrustaciones? Los vectores y la similitud del coseno se explican de forma sencilla

¿Qué son las incrustaciones? Una guía en lenguaje sencillo sobre vectores, similitud de cosenos y búsqueda semántica, con un pequeño ejemplo que eje…

Leer artículo →
DevOps

Implementación azul-verde versus implementación canaria: diferencias, compensaciones y cómo elegir

Explicación de la implementación azul-verde versus canaria: cómo funciona cada uno, costo, riesgo y reversión, agrupación estable de usuarios que pr…

Leer artículo →
Automatización de pruebas

Pruebas inestables: qué las causa y cómo solucionarlas para siempre

Pruebas inestables explicadas con demostraciones que realizamos: las causas principales, cómo confirmar y diagnosticar una, correcciones adecuadas p…

Leer artículo →
Pruebas de software

Pruebas de carga frente a pruebas de estrés: diferencias, métricas y ejemplos de k6

Explicación de las pruebas de carga frente a las pruebas de estrés: qué prueba cada una, pruebas de picos y de absorción, las métricas que importan,…

Leer artículo →
Pruebas de software

Caso de prueba frente a escenario de prueba: diferencias clave, ejemplos y cuándo utilizar cada uno

Caso de prueba versus escenario de prueba explicado: definiciones claras, una tabla en paralelo, una función de restablecimiento de contraseña tomad…

Leer artículo →
Bases de datos y SQL

Optimización de consultas SQL: lea planes de ejecución y corrija consultas lentas, con tiempos

Optimización de consultas SQL probada en un millón de filas: lea planes de ejecución, agregue los índices correctos, corrija filtros no sargables, u…

Leer artículo →
Bases de datos y SQL

SQL UNION vs UNION ALL: diferencias, ejemplos y rendimiento probado

SQL UNION vs UNION ALL explicado con consultas que ejecutamos: duplicados, las reglas que siguen ambos, un error de datos real, rendimiento medido, …

Leer artículo →
Desarrollo de software

Tutorial de JavaScript Fetch API: GET, POST, manejo de errores y tiempos de espera

Un tutorial de JavaScript Fetch API probado en un servidor local: GET y POST, por qué 404 no arroja, un asistente reutilizable, cadenas de consulta,…

Leer artículo →
Desarrollo de software

Manejo de archivos Python: lectura, escritura, CSV, JSON y pathlib con ejemplos

El manejo de archivos Python se explica con el código que ejecutamos: modos abiertos, lectura de archivos grandes, CSV, JSON, pathlib, archivos bina…

Leer artículo →
Desarrollo de software

Clases y objetos de Python: tutorial de programación orientada a objetos con ejemplos reales

Clases y objetos de Python explicados con el código que ejecutamos: __init__, métodos, atributos de clase versus instancia, herencia, propiedades, m…

Leer artículo →
Inteligencia artificial

¿Qué es un modelo de lenguaje grande? Cómo funcionan los LLM, explicados sin exageraciones

¿Qué es un modelo de lenguaje grande? Los LLM explicados en lenguaje sencillo: tokens, incrustaciones, atención, entrenamiento, ventanas de temperat…

Leer artículo →
DevOps

Comandos de Linux para principiantes: la guía esencial de terminal con ejemplos

Comandos de Linux para principiantes, agrupados por tarea: navegación, archivos, visualización de registros, grep, canalizaciones, permisos, proceso…

Leer artículo →
Automatización de pruebas

Selenium vs Playwright: diferencias clave, comparación de códigos y cuál elegir

Comparación de Selenium vs Playwright: arquitectura, espera, soporte de navegador e idioma, depuración, la misma prueba en ambas herramientas, conse…

Leer artículo →
Pruebas de software

Partición de equivalencia: técnica de diseño de pruebas explicada con ejemplos resueltos

Explicación de la partición de equivalencia: cómo encontrar particiones válidas e inválidas, ejemplos prácticos para edades, contraseñas y cupones, …

Leer artículo →
Pruebas de software

Severidad vs Prioridad en Pruebas de Software: Diferencias, Matriz y Ejemplos Reales

Explicación de gravedad versus prioridad en las pruebas de software: definiciones claras, una matriz de cuatro vías con ejemplos, escalas de niveles…

Leer artículo →
Bases de datos y SQL

Tutorial de subconsultas SQL: tipos, subconsultas correlacionadas y EXISTENCIAS con ejemplos

Un tutorial de subconsultas SQL con consultas que ejecutamos: subconsultas escalares, IN, FROM y SELECT, subconsultas correlacionadas, EXISTS, la tr…

Leer artículo →
Bases de datos y SQL

Transacciones SQL y ACID explicados: COMMIT, ROLLBACK y niveles de aislamiento

Transacciones SQL y ACID explicadas con una transferencia bancaria que ejecutamos: COMMIT, ROLLBACK, puntos de guardado, bloqueos, niveles de aislam…

Leer artículo →
Desarrollo de software

Git merge vs rebase: diferencias, ejemplos y cuándo usar cada uno

Git merge vs rebase explicado con salida real del log, una tabla comparativa, la regla de oro del rebase y un flujo de trabajo seguro para equipos.

Leer artículo →
Desarrollo de software

List comprehension en Python: sintaxis, ejemplos y cuándo evitarla

List comprehension en Python explicada: sintaxis, filtros, if-else, bucles anidados, tiempos medidos y cuándo es mejor un bucle for normal.

Leer artículo →