Claude identifica un sistema enzimático nuevo con rasgos parecidos a CRISPR

Fecha: 23 de septiembre de 2026
Fuente: Anthropic

CRISPR comenzó como un patrón de repeticiones de ADN observado en bacterias en 1987. Décadas después, los investigadores descubrieron que forma parte de un sistema de defensa microbiana; en 2012, CRISPR-Cas9 se presentó como una herramienta programable para editar ADN. Reseña histórica de la revista Journal of Bacteriology

El anuncio de Anthropic describe otro tipo de hallazgo: un sistema asociado a transcriptasas inversas, enzimas que copian ARN en ADN. Claude detectó un patrón de secuencias repetidas junto a una de estas enzimas en virus que infectan bacterias. El equipo lo llamó ART (array-associated reverse transcriptases). Su parecido con CRISPR está en la organización de las repeticiones y en que estas parecen producir ARN cortos; todavía no se ha demostrado que ART funcione como herramienta de edición genética.

Anthropic formó un grupo de investigación en biología para explorar si modelos de IA podían ayudar a descubrir sistemas biológicos en grandes bases de datos genéticas. En uno de sus primeros proyectos, agentes de Claude analizaron más de 200.000 transcriptasas inversas y seleccionaron candidatos para revisión. Tras el análisis computacional, científicos examinaron uno de ellos y realizaron pruebas de laboratorio. El equipo reporta un sistema antes no caracterizado, pero señala que aún desconoce su función. Anuncio y descripción del trabajo

Características principales

  • Sistema identificado: ART, compuesto por una transcriptasa inversa, un gen asociado y una serie de repeticiones de ADN.
  • Dónde se encontró: principalmente en bacteriófagos, virus que infectan bacterias.
  • Cómo se detectó: Claude buscó patrones en secuencias genéticas y propuso candidatos; especialistas revisaron y probaron uno en el laboratorio.
  • Escala del análisis: según Anthropic, unos 950 agentes trabajaron durante 21 horas, usando cerca de 210 millones de tokens.
  • Primer indicio experimental: las repeticiones parecen expresarse como varios ARN cortos.
  • Lo que falta saber: la función de ART y si puede tener aplicaciones biotecnológicas.

El resultado apunta a una posible nueva forma de usar IA en biología: rastrear enormes colecciones de datos, reconocer patrones poco evidentes y sugerir qué vale la pena probar en el laboratorio. Si investigaciones posteriores determinan que ART tiene una función programable, podría abrir una nueva línea de herramientas moleculares, como ocurrió con algunos sistemas CRISPR. Esa posibilidad es todavía especulativa: el anuncio presenta resultados iniciales y la función de ART sigue sin aclararse.

La noticia más sólida por ahora es el hallazgo de un sistema biológico que había pasado inadvertido y la demostración de que Claude pudo contribuir a detectarlo. Su importancia futura dependerá de que otros experimentos confirmen qué hace ART y si esa función puede aprovecharse.

Figure Helix 2.5: un robot humanoide prueba tareas en casas que no conoce

Fecha del anuncio: 17 de septiembre de 2026
Fuente: Figure — Helix 2.5

En enero de 2026, Figure presentó Helix 02, un sistema que coordina el cuerpo completo del robot para combinar caminar, mantener el equilibrio y manipular objetos. La empresa mostró, entre otras tareas, a un robot descargando un lavavajillas. Sin embargo, esos sistemas aprendían en los entornos donde después trabajarían.

Helix 2.5 aborda esa limitación: Figure afirma que el robot pudo realizar tareas en casas que no había visto durante el entrenamiento, sin recopilar datos ni ajustarse en cada una. (Helix 02; Helix 2.5)

Figure entrenó Helix 2.5 con Index, su conjunto de datos de comportamiento humano, y evaluó el modelo en 30 casas del área de la Bahía de San Francisco. Según la empresa, el mismo modelo pudo ordenar salas, doblar toallas y hacer camas en viviendas desconocidas, combinando locomoción y manipulación de objetos.

Figure reporta que el modelo tuvo una tasa de éxito del 56 % en las pruebas de generalización sin entrenamiento específico para esos hogares, frente al 9 % de su comparación sin preentrenamiento en Index. Son resultados publicados por la propia empresa; la nota no equivale a una evaluación independiente. (Anuncio de Figure)

Características destacadas

  • Generalización a casas nuevas: probó las tareas en 30 hogares que no formaron parte de la recopilación de datos del robot.
  • Tres tareas con un mismo modelo base: ordenar salas, doblar toallas y hacer camas.
  • Coordinación de cuerpo completo: combina caminar, observar el entorno y manipular objetos durante tareas de varios pasos.
  • Sin ajuste en cada vivienda: Figure dice que no recogió datos ni afinó el modelo específicamente para esas casas y objetos.
  • Preentrenamiento con Index: el sistema parte de datos de actividad humana para intentar transferir habilidades a un robot.
  • Mejor resultado reportado: Figure compara un 56 % de éxito con un 9 % sin el preentrenamiento en Index. La empresa también afirma que usó la mitad de los datos específicos de tarea que en un comportamiento representativo de Helix 02.

Los robots suelen ser sensibles a cambios en el espacio: muebles, objetos y distribución pueden afectar cómo realizan una tarea. Si un modelo logra adaptarse a lugares nuevos sin volver a entrenarse allí, podría reducir el tiempo y el costo de preparación para cada instalación. El avance también apunta a una idea importante en robótica: combinar percepción, desplazamiento y manipulación para completar tareas completas, en lugar de resolver cada movimiento por separado.

Aun así, los resultados describen tres tareas domésticas y las pruebas de Figure en 30 hogares. No demuestran que el robot pueda hacer cualquier labor en cualquier casa ni que opere con fiabilidad comercial en esas condiciones.

Helix 2.5 muestra un posible paso desde robots entrenados para un sitio concreto hacia robots que puedan transferir habilidades a entornos nuevos. Los resultados son prometedores según las pruebas de Figure, pero falta comprobar cómo se sostienen con más tareas, hogares y evaluaciones independientes.

NVIDIA presenta Isaac ROS 5.0 herramientas de IA para desarrollar robots

Fecha del anuncio: 22 de septiembre de 2026
Fuente: NVIDIA — Isaac ROS 5.0

ROS —el Sistema Operativo para Robots— es un conjunto abierto de herramientas, bibliotecas y estándares que permite crear y conectar componentes de software robótico. Isaac ROS ya ofrecía paquetes optimizados para acelerar tareas como percepción, navegación y manipulación usando hardware de NVIDIA. La versión 5.0 amplía esa base con flujos de trabajo pensados para que los agentes de IA también ayuden en el desarrollo. (NVIDIA, descripción de Isaac ROS; ROS, referencia mencionada por NVIDIA)

NVIDIA anunció Isaac ROS 5.0 en ROSCon. Es una colección gratuita y de código abierto de paquetes acelerados por GPU, construidos sobre ROS. La actualización busca facilitar tanto la creación de aplicaciones robóticas como su ejecución en robots reales: incorpora soporte para agentes de IA durante el desarrollo y opciones para desplegar las aplicaciones en dispositivos Jetson, desde Orin Nano hasta Thor. (Anuncio oficial)

Características principales

  • Flujos de trabajo para agentes de IA: los agentes pueden ayudar con tareas de desarrollo, como configurar Isaac ROS, trabajar con sus herramientas y adaptar modelos a una aplicación robótica.
  • Compatibilidad con ROS Lyrical y Ubuntu 24.04: abre una vía para adoptar la versión reciente de ROS y acelera ciertas tareas en GPU.
  • Percepción y seguimiento de objetos: la biblioteca de inferencia de FoundationPose permite estimar y seguir la posición y orientación de objetos; NVIDIA afirma que puede hacerlo hasta 5,5 veces más rápido.
  • Ajuste de percepción a las cámaras: una nueva herramienta ayuda a adaptar FoundationStereo a las cámaras y condiciones del entorno de cada proyecto.
  • Tareas de manipulación reutilizables: incluye un flujo para “detectar, tomar y colocar” objetos que puede usarse como componente independiente.
  • Ejecución en el robot: es compatible con hardware NVIDIA Jetson, lo que permite procesar modelos y aplicaciones directamente en el dispositivo.
  • Integración con el ecosistema existente: conserva ROS como base para que los desarrolladores puedan sumar aceleración y bibliotecas de NVIDIA a sistemas construidos con herramientas ROS.

Las características y cifras son las descritas por NVIDIA en su anuncio; los resultados pueden depender del hardware y de la aplicación concreta. (Anuncio oficial)

La noticia conecta dos etapas que suelen requerir mucho trabajo de integración: programar el comportamiento de un robot y ejecutarlo en el equipo físico. Si estos paquetes y flujos reducen el tiempo necesario para conectar percepción, planificación y manipulación, podrían ayudar a que más equipos desarrollen y prueben robots para fábricas, almacenes y otras tareas. El anuncio presenta herramientas para desarrolladores; por sí solo, no demuestra que los robots puedan realizar tareas generales de forma autónoma.

Isaac ROS 5.0 amplía la infraestructura abierta de ROS con aceleración de NVIDIA y asistencia de agentes de IA. Su importancia práctica dependerá de cuánto simplifique el desarrollo y de cómo rindan esas herramientas en robots y entornos reales.

Accesos directos en Visual Studio Code

Los accesos directos o shortcuts te permiten ser más productivo. Es por eso que te enlistamos algunos de los Accesos directos en Visual Studio Code, al menos algunos de los más útiles. si estás comenzando a desarrollar es bueno que te familiarices con ellos desde el inicio.

Ctrl + P – Muestra la barra de búsqueda para buscar archivos

En Mac es: Cmd + P

Con este acceso directo navegarás entre archivos todo el tiempo. Puedes escribir el nombre del archivo y abrirlo presionando Enter.

Ctrl + Shift + P – Muestra la paleta de comandos

En Mac es: Cmd + Mayús + P

Te muestra la paleta de comandos donde puedes buscar una acción.

Ctrl + B – Alternar la barra lateral

En Mac es: Cmd + B

Muestra u oculta la barra lateral donde puedes navegar por el explorador.

Ctrl + Shift + E – Ir a la ventana del Explorador

En Mac es: Cmd + Mayús + E

Va a la ventana del Explorador donde tiene su árbol de archivos y puede navegar usando las teclas de flecha.

Ctrl + Shift + M – Muestra rápidamente errores y advertencias

En Mac es: Cmd + Mayús + M

A todo el mundo le gusta el código libre de errores. Este comando muestra el panel de problemas donde puede ver los errores y advertencias identificados.

Ctrl + Shift + L – Selección multi cursor

En Mac es: Cmd + Mayús + L

Agregue cursores adicionales para editar todas las apariciones de la selección actual. Por lo general, es menos propenso a errores que buscar y reemplazar todo.

Ctrl + D – Selección uno por uno

En Mac es: Cmd + D

Similar al anterior, pero usa Ctrl + D si deseas agregar las ocurrencias de la selección actual una por una. Cada vez que presionas la combinación de teclas, agregas una nueva aparición a la selección.

Ctrl + / – alternar comentario de línea

En Mac es: Cmd + /

Alternar entre comportamiento de línea comentado y no comentado.

Ctrl + Shift + I – formatea todo el archivo

En Mac es: Mayús + Opt + F

En Windows: Mayús + Alt + F de Windows

Formatea todo el archivo activo o le solicita que instale una extensión de formateador. Puedes usar la extensión Prettier para formatear el código JS, por ejemplo.

Alt + Arriba o Alt + Abajo – Mover línea

En Mac es: Opt + Down u Opt + Up

Muy claro. Mueva la línea hacia arriba y hacia abajo.

Ctrl + Espacio – Mostrar sugerencias

Muestra sugerencias para completar rápidamente propiedades y otras cosas.

Y uno de mis favoritos:

Shift + Alt + Abajo o Shift + Alt + Arriba – Duplica la línea de código

En Mac es Mayus + Opt + Arriba o Mayus + Opt + Abajo

Este acceso directo te facilita duplicar el contenido de una línea de código hacia por debajo o arriba.

Accesos directos en Visual Studio Code

Estos son algunos de los accesos directos más útiles para Visual Studio Code, pero desde luego hay más y los puedes consultar en los siguientes enlaces:

Windows: https://code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf

Mac : https://code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf

Linux: https://code.visualstudio.com/shortcuts/keyboard-shortcuts-linux.pdf

Boilerplate code

En programación, el boilerplate code o simplemente boilerplate son esas secciones de código que deben incluirse en muchos lugares con poca o ninguna alteración. 

Cuando se utilizan lenguajes que se consideran verbosos, el programador debe escribir mucho código para lograr una mínima funcionalidad.  Dicho código se llama boilerplate.

Boilerplate code

Ver más: https://en.wikipedia.org/wiki/Boilerplate_code

El ciclo for en Java, Go y Python

Los tres lenguajes tienen for, pero cada uno lo entiende a su manera. Java tiene dos formas, Go usa una sola palabra para todos los bucles, y en Python el for siempre recorre algo. Los comparamos con ejemplos ejecutados en los tres.

Java: el for clásico y el de recorrido

public class CicloFor {
    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            System.out.println("valor de i: " + i);
        }

        String[] lenguajes = {"Java", "Go", "Python"};
        for (String l : lenguajes) {
            System.out.println(l);
        }

        for (int i = 0, j = 10; i < j; i += 3, j -= 3) {
            System.out.println(i + " " + j);
        }
    }
}
java CicloFor.javavalor de i: 0
valor de i: 1
valor de i: 2
Java
Go
Python
0 10
3 7

El primero es el for heredado de C: una inicialización, una condición que se comprueba antes de cada vuelta y un incremento que se ejecuta al final de cada una. El segundo, el «for mejorado», recorre un arreglo o cualquier colección sin índice. El tercero recuerda que cada una de las tres partes puede tener varias expresiones separadas por comas.

Go: una sola palabra para todos los bucles

package main

import "fmt"

func main() {
	for i := 0; i < 3; i++ {
		fmt.Println("valor de i: ", i)
	}

	for i := range 3 {
		fmt.Println("range:", i)
	}

	lenguajes := []string{"Java", "Go", "Python"}
	for i, l := range lenguajes {
		fmt.Println(i, l)
	}

	n := 1
	for n < 100 {
		n *= 3
	}
	fmt.Println("primera potencia de 3 mayor que 100:", n)

	for {
		fmt.Println("una vez y fuera")
		break
	}
}
go run .valor de i:  0
valor de i:  1
valor de i:  2
range: 0
range: 1
range: 2
0 Java
1 Go
2 Python
primera potencia de 3 mayor que 100: 243
una vez y fuera

Go no tiene while ni do: todo se escribe con for. Con tres partes es el clásico, sin paréntesis. Con solo la condición, hace de while. Sin nada es un bucle infinito, del que se sale con break. Y con range recorre colecciones devolviendo el índice y el valor. Desde Go 1.22, range también acepta un número: for i := range 3 da 0, 1 y 2.

Fíjate en los dos espacios de valor de i: 0. fmt.Println pone un espacio entre cada argumento, y el texto ya terminaba en espacio. En Go se escribe fmt.Println("valor de i:", i), sin el espacio final.

Python: siempre recorre algo

for i in range(3):
    print("valor de i: ", i)

for i in range(3):
    print("valor de i:", i)

lenguajes = ["Java", "Go", "Python"]
for i, l in enumerate(lenguajes):
    print(i, l)

for i in range(10, 0, -3):
    print(i, end=" ")
print()

for l in lenguajes:
    if l == "Rust":
        break
else:
    print("no había Rust")
python ciclo.pyvalor de i:  0
valor de i:  1
valor de i:  2
valor de i: 0
valor de i: 1
valor de i: 2
0 Java
1 Go
2 Python
10 7 4 1
no había Rust

En Python no hay for con contador: se recorre una secuencia, y range genera los números. range(10, 0, -3) cuenta hacia atrás de tres en tres, y enumerate da el índice junto a cada elemento. El primer print tiene el mismo doble espacio que Go, por el mismo motivo: print separa sus argumentos con un espacio.

Lo exclusivo de Python es el else del for: se ejecuta solo si el bucle terminó sin break. Sirve para búsquedas como esta, donde llegar al final significa que no se encontró nada.

Lado a lado

JavaGoPython
Contar de 0 a 9for (int i = 0; i < 10; i++)for i := 0; i < 10; i++ o for i := range 10for i in range(10):
Recorrer una colecciónfor (String l : lista)for _, l := range listafor l in lista:
Con índiceel for clásicofor i, l := range listafor i, l in enumerate(lista):
Mientras se cumpla algowhile (cond)for condwhile cond:
Infinitowhile (true)forwhile True:
Bloquellavesllaves, obligatoriassangría

Lo que cambia por debajo

La versión anterior de esta entrada decía que Java es un lenguaje interpretado, como Python. No es exacto, y la diferencia explica buena parte de la diferencia de velocidad. Java se compila a bytecode, y la máquina virtual compila a código máquina, mientras el programa se ejecuta, las partes que más se usan. Go se compila directamente a un ejecutable nativo. Python, en su implementación habitual, también compila a bytecode, pero lo interpreta instrucción a instrucción, y por eso un bucle con mucho cálculo suele ir bastante más despacio. Para medirlo bien, mira medir el rendimiento en Java.

Entrada publicada en 2020 y revisada en octubre de 2026. Cada ejemplo se ejecutó en un contenedor limpio con Java 25 LTS, Go 1.25 y Python 3.14; las salidas están copiadas de esa ejecución.

Librerías de Java para Reportes

Estas son algunas de las librerías para Java que puedes usar para generar reportes en diversos formatos, agregar gráficas y otros recursos útiles para mostrar datos al usuario final. Algunos proyectos disponen de una versión opensource, edición community y versiones comerciales.

JFreeChart

JFreeChart es una biblioteca de gráficos hecha 100% Java que facilita a los desarrolladores mostrar gráficos de calidad profesional en tus aplicaciones. El amplio conjunto de características de JFreeChart incluye:

  • Una API consistente y bien documentada, que admite una amplia gama de tipos de gráficos
  • Diseño flexible que es fácil de ampliar, dirigida tanto a aplicaciones de servidor como del cliente.
  • Compatibilidad con muchos tipos de salida, incluidos los componentes Swing y JavaFX, archivos de imagen (incluidos PNG y JPEG) y formatos de archivos de gráficos vectoriales (incluidos PDF, EPS y SVG)
  • JFreeChart es de código abierto o más específicamente, software libre. Se distribuye bajo los términos de la GNU Lesser General Public Licence (LGPL), que permite su uso en aplicaciones propietarias.

JasperReport

JasperReport es una de las herramientas para reportes de código abierto más populares y ampliamente utilizadas. Se usa en cientos de miles de entornos de producción y presenta versiones tanto community como comerciales.

  • Formateo y visualización de reportes interactivos
  • Repositorio central seguro
  • Informe de programación y distribución
  • Interfaz de usuario personalizable y personalizable

BIRT

BIRT consta de varios componentes. Los componentes principales incluyen un diseñador de reportes y en tiempo de ejecución de BIRT, pero BIRT también proporciona tres componentes adicionales: un motor de gráficos, un diseñador de gráficos y un visor. Con estos componentes, podrías desarrollar y publicar informes como una solución independiente.

  • Listas
  • Gráficas
  • Tablas cruzadas
  • Cartas y documentos
  • Informas compuestos

Pentaho

Pentaho es una suite empresarial completa, que abarca una amplia gama de casos de uso desde reportes hasta minería de datos. La suite de Pentaho BI abarca varios proyectos de código abierto, de los cuales Pentaho Reporting es uno de ellos. Al igual que las otras herramientas, Pentaho Reporting tiene un amplio conjunto de funciones, listas para su uso en organizaciones empresariales.

  • Permite crear reportes en PDF, Excel, HTML, texto, archivo de texto enriquecido, XML y CSV.

SpagoBI

SpagoBI es otra suite de inteligencia empresarial completa. Algunas herramientas que incluye son, por ejemplo: reportes, gráficos, cockpits, minería de datos, ETL y mucho más. La empresa que respalda este desarrollo ofrece servicios profesionales como asistencia al usuario, mantenimiento, consultoría y capacitación.

  • Reportes en formatos HTML, PDF, XLS, XML, TXT, CSV, RTF
  • Análisis multidimensional (OLAP)
  • Gráficas
  • KPIs
  • Coopits Interactivos
  • Reportes ad-hoc
  • Muchas otras características.

KNIME

KNIME es una plataforma de análisis de código abierto, con orígenes en la investigación farmacéutica. Su uso se ha expandido a industrias como bancos, editores, fabricantes de automóviles, compañías de telecomunicaciones y otros.

KNIME proporciona una gama de características, que incluyen extensiones de colaboración y un portal web. El aprendizaje automático también está integrado, incluido el soporte de Weka.

ReportServer

ReportServer es otra plataforma de inteligencia empresarial de código abierto, con una edición comercial disponible también. ReportServer permite crear reportes, análisis ad-hoc, informes de Excel y Word y análisis OLAP multidimensionales.

Primera Imagen de un Agujero Negro, por Katherine Louise Bouman


Katherine Louise Bouman es una científica y profesora asistente de ciencias de la computación en el Instituto de Tecnología de California.  Hace tres años, Bouman lideró la creación de un algoritmo que eventualmente ayudó a formar esta imagen única en su clase: un agujero negro supermasivo y su sombra en el centro de una galaxia conocida como M87. Ella era entonces una estudiante graduada en ciencias de la computación e inteligencia artificial en el Instituto de Tecnología de Massachusetts.

Puedes ver una interesante charla de Bouman y su propuesta para la detección de agujeros negros en TED de hace tres años.

Años más tarde puedes ver que su investigación es un total éxito.

Ella y su equipo tomaron los «datos escasos y ruidosos» que generaron diversos radiotelescopios alrededor del mundo e intentaron crear una imagen. Durante los últimos años, Bouman dirigió la verificación de imágenes y la selección de parámetros para crearla. Mas de 5 petabytes fueron necesarios para recabar la información de todos los centros de investigación que participaron.

 

 

La imagen obtenida, revela la cara sombría de un agujero negro supermasivo de 6.500 millones de masas solares en el centro de Messier 87 (M87), una gran galaxia a unos 55 millones de años luz de la Tierra en el cúmulo de galaxias de Virgo. Tales objetos son la comprobación (una vez más) de la teoría de la relatividad general de Einstein que predice la deformación del espacio-tiempo por objetos súper massivos.

Las librerías de Python más usadas, con ejemplos que funcionan

Portada: las librerías de Python más usadas, con el logotipo de Python y los nombres de diez librerías: requests, tqdm, Pillow, NumPy, pandas, Matplotlib, Beautiful Soup, SQLAlchemy, FastAPI y pytest

Python trae mucho de serie, pero buena parte de lo que se hace con él a diario se apoya en librerías externas. Estas son las que más se usan, agrupadas por tarea y cada una con un ejemplo corto que puedes copiar y ejecutar.

Cómo instalarlas

Lo recomendable es instalar cada proyecto en su propio entorno virtual, para que las versiones de un proyecto no choquen con las de otro:

python -m venv venv
source venv/bin/activate        # en Windows: venv\Scripts\activate
pip install requests tqdm pillow numpy pandas matplotlib beautifulsoup4 sqlalchemy fastapi httpx2 pytest

Ten en cuenta que el nombre del paquete no siempre coincide con el del import: se instala pillow y se importa PIL, se instala beautifulsoup4 y se importa bs4.

Para…LibreríaVersión probada
Peticiones HTTPrequests2.34.2
Barras de progresotqdm4.70.1
ImágenesPillow12.3.0
Cálculo numéricoNumPy2.5.3
Tablas de datospandas3.0.6
GráficasMatplotlib3.11.2
Extraer datos de HTMLBeautiful Soup4.15.0
Bases de datosSQLAlchemy2.1.4
APIs webFastAPI0.143.0
Pruebaspytest9.1.1

requests: peticiones HTTP

import requests

r = requests.get("https://httpbin.org/get", params={"lenguaje": "python"}, timeout=10)
print(r.status_code, r.headers["Content-Type"])
print(r.json()["args"])

r = requests.post("https://httpbin.org/post", json={"sitio": "decodigo.com"}, timeout=10)
print(r.json()["json"])
salida200 application/json
{'lenguaje': 'python'}
{'sitio': 'decodigo.com'}

Con params se arma la cadena de consulta, con json= se envía un cuerpo JSON con su cabecera, y r.json() decodifica la respuesta. Pon siempre un timeout: sin él, una petición a un servidor que no responde puede quedarse esperando indefinidamente. Si solo necesitas algo puntual y no quieres dependencias, la biblioteca estándar también lo hace; lo vemos en peticiones HTTP sin dependencias.

tqdm: barras de progreso

from time import sleep
from tqdm import tqdm

total = 0
for n in tqdm(range(50), desc="Procesando", ncols=70):
    total += n
    sleep(0.02)
print("suma:", total)
salida, última línea de la barraProcesando: 100%|█████████████████████| 50/50 [00:01<00:00, 49.11it/s]
suma: 1225

Basta con envolver el iterable en tqdm(). La barra se va redibujando en la misma línea y muestra el avance, la velocidad y el tiempo que falta. Es muy útil en procesos largos, porque deja ver enseguida si el trabajo avanza o se ha atascado.

Pillow: imágenes

from PIL import Image, ImageDraw

img = Image.new("RGB", (800, 400), "#1e64af")
ImageDraw.Draw(img).rectangle([40, 40, 760, 360], outline="white", width=8)
img.save("original.png")

copia = Image.open("original.png")
copia.thumbnail((200, 200))
copia.save("miniatura.png")
print(Image.open("original.png").size, "->", Image.open("miniatura.png").size)
salida(800, 400) -> (200, 100)

thumbnail reduce la imagen para que quepa en la caja que le das (200×200), pero conserva la proporción: por eso queda en 200×100 y no se deforma. Pillow abre y guarda los formatos habituales (PNG, JPEG, WebP, GIF…) y sirve para recortar, rotar, dibujar o cambiar el formato por lotes.

NumPy y pandas: datos

import numpy as np
import pandas as pd

temps = np.array([18.5, 21.0, 24.3, 19.8, 22.1])
print("media:", temps.mean().round(2), "máxima:", temps.max())
print(temps * 9 / 5 + 32)

ventas = pd.DataFrame({
    "lenguaje": ["Python", "Java", "Python", "Go", "Java", "Python"],
    "visitas": [120, 80, 150, 40, 95, 130],
})
print(ventas.groupby("lenguaje")["visitas"].agg(["count", "sum", "mean"]).sort_values("sum", ascending=False))
salidamedia: 21.14 máxima: 24.3
[65.3  69.8  75.74 67.64 71.78]
          count  sum        mean
lenguaje
Python        3  400  133.333333
Java          2  175   87.500000
Go            1   40   40.000000

NumPy opera sobre arreglos completos de una vez: temps * 9 / 5 + 32 convierte las cinco temperaturas sin escribir ningún bucle, y además mucho más rápido que un bucle en Python. pandas se apoya en NumPy para trabajar con tablas: aquí agrupa por lenguaje y calcula el número de filas, la suma y la media de cada grupo en una sola línea. Si trabajas con archivos muy grandes, merece la pena mirar también Polars, una alternativa más reciente y muy rápida.

Matplotlib: gráficas

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

lenguajes = ["Python", "Java", "Go", "Rust"]
visitas = [400, 175, 40, 65]

fig, ax = plt.subplots(figsize=(8, 4.2))
ax.bar(lenguajes, visitas, color="#1e64af")
ax.set_title("Visitas por lenguaje")
ax.set_ylabel("visitas")
fig.tight_layout()
fig.savefig("grafica.png", dpi=150)
print("guardada grafica.png")
Gráfica de barras generada con matplotlib: visitas por lenguaje, con Python a la cabeza, seguido de Java, Rust y Go (datos de ejemplo)
La gráfica que genera el ejemplo, tal cual. Los datos son inventados.

matplotlib.use("Agg") hace que dibuje directamente a un archivo, sin abrir ninguna ventana; así funciona también en un servidor o en un contenedor. En tu ordenador puedes quitarlo y llamar a plt.show() para ver la gráfica en pantalla.

Beautiful Soup: extraer datos de HTML

from bs4 import BeautifulSoup

html = """
<ul id="lenguajes">
  <li class="activo"><a href="/python">Python</a></li>
  <li><a href="/java">Java</a></li>
  <li class="activo"><a href="/rust">Rust</a></li>
</ul>
"""
soup = BeautifulSoup(html, "html.parser")
for a in soup.select("#lenguajes li.activo a"):
    print(a.text, "->", a["href"])
salidaPython -> /python
Rust -> /rust

select acepta selectores CSS, los mismos que se usan en las hojas de estilo, así que #lenguajes li.activo a se lee igual que en CSS. Para descargar la página se combina con requests. Si lo que necesitas es recorrer un sitio entero siguiendo enlaces, la herramienta adecuada es Scrapy. Y antes de extraer datos de un sitio, revisa sus condiciones de uso y su robots.txt.

SQLAlchemy: bases de datos

from sqlalchemy import create_engine, select, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session

class Base(DeclarativeBase):
    pass

class Articulo(Base):
    __tablename__ = "articulos"
    id: Mapped[int] = mapped_column(primary_key=True)
    titulo: Mapped[str] = mapped_column(String(100))
    visitas: Mapped[int]

engine = create_engine("sqlite:///:memory:")
Base.metadata.create_all(engine)

with Session(engine) as s:
    s.add_all([Articulo(titulo="Hola mundo", visitas=10),
               Articulo(titulo="Leer CSV", visitas=42),
               Articulo(titulo="Peticiones HTTP", visitas=27)])
    s.commit()
    consulta = select(Articulo).where(Articulo.visitas > 20).order_by(Articulo.visitas.desc())
    for a in s.scalars(consulta):
        print(a.titulo, a.visitas)
salidaLeer CSV 42
Peticiones HTTP 27

Cada tabla se define como una clase, y las consultas se escriben en Python en lugar de en SQL. Es el estilo de SQLAlchemy 2, con anotaciones de tipo (Mapped[int]). El mismo código funciona con SQLite, PostgreSQL o MySQL cambiando solo la cadena de conexión. Para SQLite sin ninguna librería externa, mira SQLite con Python.

FastAPI: APIs web

from fastapi import FastAPI
from fastapi.testclient import TestClient
from pydantic import BaseModel

app = FastAPI()

class Articulo(BaseModel):
    titulo: str
    visitas: int = 0

@app.get("/saludo/{nombre}")
def saludo(nombre: str):
    return {"mensaje": f"Hola, {nombre}"}

@app.post("/articulos")
def crear(articulo: Articulo):
    return {"creado": articulo.titulo, "visitas": articulo.visitas}

cliente = TestClient(app)
print(cliente.get("/saludo/Ana").json())
print(cliente.post("/articulos", json={"titulo": "FastAPI"}).json())
r = cliente.post("/articulos", json={"visitas": "muchas"})
print(r.status_code, [e["loc"][-1] + ": " + e["type"] for e in r.json()["detail"]])
salida{'mensaje': 'Hola, Ana'}
{'creado': 'FastAPI', 'visitas': 0}
422 ['titulo: missing', 'visitas: int_parsing']

FastAPI usa las anotaciones de tipo para validar lo que llega: en la última petición falta el título y visitas no es un número, así que responde con un error 422 que explica cada fallo, sin que hayas escrito ninguna validación. Aquí se prueba con TestClient, que llama a la API sin levantar un servidor; en producción se ejecuta con uvicorn.

Con las versiones actuales, TestClient avisa de que usar httpx está obsoleto y pide instalar httpx2. Por eso aparece en el pip install de arriba; con él, el aviso desaparece y el ejemplo funciona igual.

Si buscas un framework completo, con panel de administración, usuarios y plantillas incluidos, la referencia es Django. Para algo pequeño y sin estructura impuesta, Flask.

pytest: pruebas

import pytest

def precio_con_iva(precio, iva=0.16):
    if precio < 0:
        raise ValueError("el precio no puede ser negativo")
    return round(precio * (1 + iva), 2)

def test_iva_por_defecto():
    assert precio_con_iva(100) == 116.0

@pytest.mark.parametrize("precio, iva, esperado", [(50, 0.16, 58.0), (200, 0.08, 216.0), (0, 0.16, 0.0)])
def test_varios(precio, iva, esperado):
    assert precio_con_iva(precio, iva) == esperado

def test_negativo():
    with pytest.raises(ValueError):
        precio_con_iva(-1)
python -m pytest -v test_precios.py
salida (recortada)test_precios.py::test_iva_por_defecto PASSED                             [ 20%]
test_precios.py::test_varios[50-0.16-58.0] PASSED                        [ 40%]
test_precios.py::test_varios[200-0.08-216.0] PASSED                      [ 60%]
test_precios.py::test_varios[0-0.16-0.0] PASSED                          [ 80%]
test_precios.py::test_negativo PASSED                                    [100%]

============================== 5 passed in 0.04s ===============================

Las pruebas son funciones que empiezan por test_ y usan un assert normal. parametrize ejecuta la misma prueba con varios casos, y cada uno aparece por separado en el informe; pytest.raises comprueba que se lanza la excepción esperada.

Otras que conviene conocer

LibreríaPara qué
scikit-learnAprendizaje automático clásico: clasificación, regresión, agrupamiento
PyTorchRedes neuronales y aprendizaje profundo
KerasAPI de alto nivel para redes neuronales; desde Keras 3 funciona sobre JAX, TensorFlow o PyTorch
NLTK y spaCyProcesamiento de lenguaje natural
ScapyCrear, enviar y analizar paquetes de red; muy usada en seguridad
KivyInterfaces gráficas multiplataforma, también para móviles
La versión de 2019 de esta entrada incluía Twisted, un framework de red basado en eventos. Sigue existiendo, pero hoy, para la mayoría de los programas concurrentes, se usa asyncio, que viene con Python, o librerías construidas sobre él.

Entrada publicada en 2019 y revisada en octubre de 2026. Todo el código se ejecutó con Python 3.14.8 en un contenedor limpio, con las versiones de la tabla; las salidas están copiadas de esa ejecución.