Tutorial de Terraform para principiantes: Infraestructura como código desde el primer archivo hasta los módulos
Aprenda Terraform sin una cuenta en la nube ni una factura sorpresa. Comience con archivos locales para comprender el plan, la aplicación y el estado, luego pase a recursos, módulos y flujos de trabajo reales en la nube que sean seguros para los equipos.
- Terraform crea y cambia la infraestructura a partir de archivos de texto que puedes guardar en Git.
- El flujo de trabajo principal es
init,plan,applyyplanmuestra los cambios antes de que ocurran. - El archivo de estado registra lo que gestiona Terraform. Protégelo y nunca lo envíes a Git.
- Utilice módulos para reutilizar patrones y estado remoto con bloqueo cuando trabaje en equipo.
Hacer clic en una consola en la nube está bien para un servidor. Se estropea cuando se necesita la misma configuración en puesta en escena y producción, o cuando alguien pregunta quién cambió una regla de firewall en marzo pasado. Este tutorial de Terraform para principiantes le muestra una mejor manera: describir su infraestructura en código y dejar que una herramienta la haga realidad.
La mayoría de los tutoriales comienzan con una cuenta en la nube, lo que aumenta el riesgo de facturación antes de que haya aprendido algo. Comenzamos con el proveedor Terraform local, que simplemente crea archivos en su computadora, por lo que los errores no cuestan nada. Estos ejemplos y el resultado de muestra son ilustraciones estándar que no ejecutamos para este artículo y la redacción exacta varía según la versión.
¿Qué es Terraform?
Terraform es una herramienta de infraestructura como código (IaC) de HashiCorp. Usted escribe archivos de configuración en HCL, el lenguaje de configuración de HashiCorp, y describe el resultado final que desea. Luego, Terraform decide qué crear, cambiar o eliminar para llegar allí.
Se comunica con plataformas a través de complementos llamados proveedores. Hay proveedores para AWS, Azure, Google Cloud, Kubernetes, GitHub, Cloudflare y muchos otros, por lo que puedes utilizar un flujo de trabajo en todos ellos.
Una cosa que debe saber: en 2023, HashiCorp trasladó Terraform a la licencia de fuente comercial. Luego, la comunidad creó OpenTofu, una bifurcación de código abierto que utiliza comandos y configuraciones muy similares. Lo que aprende aquí se aplica en gran medida a ambos.
¿Por qué infraestructura como código?
| Pregunta | Trabajo manual de la consola | Terraformar |
|---|---|---|
| ¿Quién cambió qué? | Difícil de descubrir | historia de git |
| ¿Podemos copiar la puesta en escena a la producción? | Hacer clic con cuidado | Reutilizar el código |
| ¿Qué hará este cambio? | Lo descubres después | terraform plan te muestra primero |
| ¿Alguien puede revisarlo? | No fácilmente | Una solicitud de extracción normal |
| Recuperación ante desastres | Depende de la memoria de las personas. | Recreación a partir de código y copias de seguridad de datos |
Terraform también es declarativo. Usted dice “debería haber tres servidores”, no “crear un servidor tres veces”. Si ya existen dos, agrega uno. Un guión que simplemente repita sus pasos podría terminar creando tres más.
Instalar Terraform
Instálelo siguiendo las instrucciones oficiales de HashiCorp para su sistema operativo y luego confirme que funciona:
terraform -version
Cree una carpeta vacía para el proyecto. Terraform lee cada archivo .tf en la carpeta actual, por lo que una carpeta equivale a una configuración.
Tu primera configuración
Cree un archivo llamado main.tf:
terraform {
required_providers {
local = {
source = "hashicorp/local"
version = "~> 2.5"
}
}
}
resource "local_file" "greeting" {
filename = "${path.module}/hello.txt"
content = "Hello from Terraform\n"
}
Mira el bloque resource, ya que casi todo lo que escribes sigue esta forma. local_file es el tipo de recurso y greeting es su propio nombre dentro de la configuración. Juntos forman su dirección: local_file.greeting. Los argumentos internos describen lo que desea.
El flujo de trabajo: iniciar, planificar, aplicar
inicio de terraformación
Esto prepara la carpeta y descarga los proveedores que solicitó. Ejecútelo una vez al inicio y nuevamente cada vez que agregue un proveedor o módulo. También crea un archivo .terraform.lock.hcl, que registra las versiones exactas del proveedor. Confirme ese archivo en Git.
terraform init
plan de terraformación
Esto compara tu código con lo que existe y muestra los cambios planificados, sin tocar nada:
terraform plan
# local_file.greeting will be created
+ resource "local_file" "greeting" {
+ content = "Hello from Terraform\n"
+ filename = "./hello.txt"
}
Plan: 1 to add, 0 to change, 0 to destroy.
Aprende los símbolos, porque leerás muchos planos:
| Símbolo | Significado |
|---|---|
+ |
crear |
~ |
Actualización en marcha |
- |
destruir |
-/+ |
Destruir y recrear |
aplicar terraformar
Esto muestra nuevamente el plan, pide confirmación y realiza los cambios:
terraform apply
Escriba yes y aparecerá hello.txt. Ahora ejecute terraform plan nuevamente. No debería informar ningún cambio, porque la realidad ya coincide con su código. Esta propiedad, donde ejecutarla repetidamente no provoca más cambios, se llama idempotencia.
Cambiando y destruyendo
Edite la línea content y ejecute terraform plan. Terraform detecta la diferencia y propone un cambio. Para este recurso, reemplaza el archivo. Preste atención a los reemplazos en infraestructura real, ya que recrear una base de datos podría significar perder datos.
A continuación, elimine hello.txt a mano y planifique nuevamente. Terraform se da cuenta de que falta y se ofrece a recrearlo. Una diferencia entre tu código y la realidad se llama deriva, y detectarla es uno de los principales beneficios de la herramienta.
Para eliminar todo lo que administra esta configuración, ejecute:
terraform destroy
Variables y salidas
Los valores codificados le impiden reutilizar el código. Las variables de entrada hacen que la configuración sea flexible y las salidas informan valores útiles:
# variables.tf
variable "environment" {
type = string
description = "Deployment environment"
default = "dev"
validation {
condition = contains(["dev", "staging", "prod"], var.environment)
error_message = "Use dev, staging or prod."
}
}
# main.tf
resource "local_file" "config" {
filename = "${path.module}/${var.environment}.txt"
content = "environment=${var.environment}\n"
}
# outputs.tf
output "config_path" {
value = local_file.config.filename
}
Establezca valores en la línea de comando o guárdelos en un archivo llamado terraform.tfvars, que se carga automáticamente:
terraform apply -var="environment=staging"
El uso de local_file.config.filename en la salida también es la forma en que los recursos se refieren entre sí. Terraform lee esas referencias para determinar el orden correcto en el que crear las cosas.
Estado de terraformación
Después de realizar la solicitud, encontrará un archivo llamado terraform.tfstate. Este es el registro de Terraform de lo que gestiona, asignando su código a objetos reales. Sin él, Terraform no sabría que local_file.greeting es ese archivo específico.
Aquí importan tres reglas:
- Nunca confirmes el estado en Git. Puede contener contraseñas y otros secretos en texto sin formato.
- No lo edites a mano. Utiliza comandos como
terraform state listyterraform state mv. - Utilice un backend remoto para proyectos de equipo. Un backend compartido almacena el estado de forma centralizada y lo bloquea, por lo que dos personas no pueden postularse a la vez.
A continuación se muestra un backend típico que utiliza Amazon S3, con un depósito que usted crea con anticipación:
terraform {
backend "s3" {
bucket = "my-company-terraform-state"
key = "shop/prod/terraform.tfstate"
region = "ap-south-1"
encrypt = true
use_lockfile = true
}
}
Consejo: Comience cada proyecto con un .gitignore que excluya .terraform/, *.tfstate, *.tfstate.* y cualquier *.tfvars archivo que contenga secretos.
Un verdadero recurso en la nube
El flujo de trabajo no cambia cuando pasa a una nube. Aquí hay un depósito de S3 en AWS. Primero verifique los precios y destruya todo lo que cree mientras practica:
provider "aws" {
region = "ap-south-1"
}
resource "aws_s3_bucket" "reports" {
bucket = "my-unique-reports-bucket-2026"
tags = {
Environment = var.environment
ManagedBy = "terraform"
}
}
Terraform obtiene credenciales de la configuración de AWS CLI o de las variables de entorno. Nunca escriba claves de acceso en un archivo .tf.
Módulos
Un módulo es simplemente una carpeta de archivos Terraform a los que puedes llamar con diferentes entradas. Funciona de forma muy parecida a una función, permitiéndote definir un patrón una vez y reutilizarlo:
project/
main.tf
modules/
reports_bucket/
main.tf
variables.tf
outputs.tf
module "staging_reports" {
source = "./modules/reports_bucket"
environment = "staging"
}
module "prod_reports" {
source = "./modules/reports_bucket"
environment = "prod"
}
El Registro público de Terraform también tiene módulos listos para usar, pero léalos antes de confiar en ellos y fije la versión. No cree módulos demasiado pronto. Espere hasta haber repetido un patrón al menos dos veces.
Un flujo de trabajo de equipo seguro
- Cree una rama y cambie los archivos
.tf. Consulta nuestro tutorial de Git para principiantes si necesitas un repaso. - Ejecute
terraform fmtyterraform validate. - Abra una solicitud de extracción, con el resultado de
terraform planadjunto para su revisión. - Después de la aprobación, aplique ese plan guardado desde un lugar controlado, idealmente una tubería.
Guardar el plan garantiza que usted aplique exactamente lo que se revisó:
terraform plan -out=tfplan
terraform apply tfplan
Esto encaja naturalmente en CI/CD y GitHub Actions. Terraform generalmente aprovisiona el clúster y herramientas como Kubernetes luego ejecutan aplicaciones sobre él.
Errores comunes
- Solicitar sin leer el plan. Un
-/+en una base de datos puede ser una sorpresa muy costosa. - Mantener el estado en una computadora portátil. Si pierde esa computadora portátil, Terraform perderá el seguimiento de su infraestructura.
- Realizar cambios manuales en la consola. Provocan desviaciones y la siguiente aplicación puede deshacerlas.
- Usar versiones no fijadas. Fijar las versiones del proveedor y del módulo para que las actualizaciones se realicen a propósito.
- Usar una configuración enorme. Dividir por entorno o sistema limita el daño de cualquier error.
Conclusión
Ya ha visto las ideas detrás de casi todo el trabajo de Terraform: declarar recursos, revisar el plan, aplicarlo y proteger el estado. Practique con el proveedor local hasta que el flujo de trabajo le parezca natural y luego administre un pequeño recurso real en una cuenta de nivel gratuito. Coloque los módulos y el estado remoto una vez que esté involucrada más de una persona o más de un entorno.
Preguntas frecuentes
¿Para qué se utiliza Terraform?
Terraform se utiliza para crear y administrar infraestructura, como servidores, redes, bases de datos y DNS, describiéndola en código en lugar de configurarla a mano.
¿Terraform es gratuito?
Terraform CLI es de uso gratuito según su licencia de fuente comercial, aunque los términos restringen algunos usos comerciales competitivos. HCP Terraform tiene niveles pagos y OpenTofu es de código abierto.
¿Cuál es la diferencia entre Terraform y Ansible?
Terraform aprovisiona principalmente infraestructura de forma declarativa. Ansible configura principalmente software en máquinas existentes. Muchos equipos usan ambos, Terraform primero y Ansible después.
¿Qué es un archivo de estado de Terraform?
Es un registro que asigna su configuración a recursos reales. Terraform lo usa para resolver cambios. Puede contener secretos, así que guárdelo de forma segura y manténgalo fuera de Git.
¿Necesito saber programación para aprender Terraform?
No precisamente. HCL es simple y declarativo. Comprender la plataforma que administra, como las redes de AWS, suele ser más difícil que el lenguaje mismo.
sigue aprendiendo
¿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.
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.
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 →DevOpsExplicació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 softwareExplicació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 pruebasBurlarse 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 softwareExplicació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 SQLDELETE 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 SQLVistas 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 softwareInterfaz 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 softwarePython *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 softwareFunciones 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 →DevOpsMonitoreo 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 →DevOpsDocker 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 pruebasTDD 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 softwarePruebas 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 SQLValores 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 SQLDeclaració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 softwareExplicació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 softwareExplicació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 →DevOpsImplementació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 pruebasPruebas 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 softwarePruebas 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 softwareCaso 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 SQLOptimizació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 SQLSQL 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 softwareTutorial 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 softwareManejo 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 softwareClases 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 →DevOpsComandos 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 pruebasSelenium 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 softwarePartició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 softwareSeveridad 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 SQLTutorial 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 SQLTransacciones 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 softwareHoja de trucos de comandos de Git: los comandos que realmente usas, con ejemplos
Una hoja de referencia de comandos de Git agrupada por tarea: configuración, preparación, ramas, controles remotos, almacenamiento, historial y desh…
Leer artículo →Desarrollo de softwareExplicación de las promesas de JavaScript: luego, captura, Promise.all y errores comunes
Las promesas de JavaScript se explican con el código que ejecutamos: estados, luego y cadenas de captura, manejo de errores, Promise.all, allSettled…
Leer artículo →Desarrollo de softwareTutorial del diccionario Python: métodos, ejemplos y patrones comunes
Un tutorial de diccionario de Python con el código que ejecutamos: crear, leer y actualizar dictados, métodos clave, fusión, comprensión, patrones d…
Leer artículo →Inteligencia artificial¿Qué es el RAG? Generación de recuperación aumentada explicada con un ejemplo práctico
¿Qué es RAG? Generación de recuperación aumentada explicada paso a paso: indexación, fragmentación, incrustaciones, recuperación, un pequeño ejemplo…
Leer artículo →DevOpsTutorial de Terraform para principiantes: infraestructura como código desde el primer archivo hasta los módulos
Un tutorial de Terraform para principiantes: comience sin una cuenta en la nube, aprenda init, planifique y aplique, luego variables, resultados, es…
Leer artículo →DevOpsDocker vs Kubernetes: diferencias clave, cómo funcionan juntos y cuál necesita
Docker vs Kubernetes explicó: qué hace cada uno, la misma aplicación se ejecuta con ambos, se comparan Docker Compose y Swarm, los Dockershim cambia…
Leer artículo →Automatización de pruebasTutorial de Pytest para principiantes: accesorios, parametrización y ejemplos reales
Un tutorial de pytest para principiantes con pruebas que ejecutamos en pytest 9.2: afirmaciones, accesorios, parametrización, conftest, marcadores, …
Leer artículo →Pruebas de softwareCiclo de vida de pruebas de software (STLC): 6 fases, criterios de entrada y salida, ejemplo
Se explicó el ciclo de vida de las pruebas de software: seis fases de STLC con criterios de entrada y salida, entregables, un ejemplo de función de …
Leer artículo →Desarrollo de softwareGit 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 softwareList 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 →