🐍 Python — 1991

⬅️ Atlas · 🗂️ Todas las fichas · 📚 Índice de clases

Python es hoy el lenguaje más enseñado del mundo y el que más gente escribe sin llamarse programadora. Su historia explica las dos cosas: nació para ser legible, y treinta años después esa decisión resultó valer más que casi cualquier otra característica técnica.

🎯 Por qué está en este programa

Python es uno de los diez lenguajes del núcleo: se implementa y se verifica en CI en las 136 clases de código. Esta ficha no repite eso — cuenta su historia y responde a por qué se eligió como representante.

Python es el representante del scripting dinámico (Atlas): tipado dinámico, poca ceremonia, y una biblioteca estándar que cubre casi todo. Quien entiende la versión Python de una clase reconoce después la de Ruby, Perl, Lua, Tcl o R sin haberlas visto. Y es, además, el lenguaje con el que hoy se pega el resto del sistema (clase 155).

Año 1991; 2.0 en 2000; 3.0 en 2008; ciclo anual desde 3.9
Autoría Guido van Rossum, CWI (Ámsterdam), como sucesor de ABC
Familia Scripting dinámico — con influencia de ABC, Modula-3, C y Lisp
Paradigma Multiparadigma: imperativo, orientado a objetos y funcional
Tipado Dinámico y fuerte; anotaciones opcionales comprobadas por herramientas
Memoria Automática: conteo de referencias + recolector de ciclos
Ejecución Compilado a bytecode e interpretado (CPython); PyPy con JIT
Estado 🟢 Dominante en ciencia de datos, IA, automatización y enseñanza

📜 Historia

Guido van Rossum trabajaba en el CWI de Ámsterdam en ABC, un lenguaje de enseñanza muy cuidado que nunca despegó. De ABC se llevó una obsesión —que el código se lea— y una lección: ABC era cerrado y no se podía extender, y por eso murió.

En las navidades de 1989 empezó Python como proyecto personal. El nombre no viene del reptil sino de Monty Python's Flying Circus, y esa broma marcó el tono de toda la documentación durante décadas.

Las decisiones que lo definieron estaban ahí desde el principio: la indentación como sintaxis —el bloque se marca con espacios, no con llaves—, todo es un objeto, y una biblioteca estándar grande, la política de las "baterías incluidas".

Python 2.0 (2000) trajo la comprensión de listas y el recolector de ciclos. Python 3.0 (2008) rompió la compatibilidad para arreglar lo que estaba mal —sobre todo la distinción entre bytes y texto, que en Python 2 era una fuente constante de errores (clase 093)— y la migración costó doce años: el soporte de Python 2 terminó en 2020.

Esa transición es un caso de estudio de la clase 143: una ruptura necesaria, técnicamente correcta y socialmente carísima.

Desde 3.9 hay una versión anual con fecha fija, y el lenguaje ha ido incorporando anotaciones de tipo (2015), async/await (2015), el operador morsa (2018), el emparejamiento estructural (2021) y, en marcha, la eliminación del bloqueo global del intérprete.

🏭 Dónde vive hoy

🧠 La decisión que lo explica: legibilidad sobre todo lo demás

Python renuncia a cosas que otros lenguajes consideran irrenunciables, y cada renuncia compra legibilidad:

Y el coste hay que decirlo con la misma claridad:

El precio es el rendimiento y la concurrencia. CPython interpreta bytecode y tiene un bloqueo global del intérprete (el GIL) que impide que dos hilos ejecuten bytecode a la vez. Por eso el Python que va rápido casi nunca es Python: NumPy, PyTorch y pandas son C, C++ y Fortran por debajo (clase 155), y Python es la capa que los compone. Entender eso es entender por qué el lenguaje "lento" domina el cálculo intensivo.

🔄 Lo que se ha modernizado

⚙️ Cómo se ejecuta hoy

python3 main.py < entrada.txt          # el comando de la clase 041

# Entorno y dependencias reproducibles (clase 143):
uv venv && uv pip install -r requirements.txt
uv run main.py

# Calidad, como en la clase 146:
ruff check . && ruff format --check .
mypy .
pytest

🧪 El programa de la clase 041 en Python

Es el que se ejecuta y se verifica en la clase 041.

import sys

# Literales y constantes: los valores se leen y se nombran.
precio_str, cantidad_str, descuento_str = sys.stdin.readline().split()

PRECIO_UNITARIO = float(precio_str)   # tipo dinámico, inferido en tiempo de ejecución
CANTIDAD = int(cantidad_str)
DESCUENTO = float(descuento_str)

subtotal = PRECIO_UNITARIO * CANTIDAD
total = subtotal * (1 - DESCUENTO)

print(f"Total: {total:.2f}")

Lo que hay que ver, comparando con las otras fichas.

📚 Fuentes y bibliografía


⏮️ Volver al Atlas · 🗂️ Todas las fichas · 🔗 Relacionadas: Ruby · Perl · Lua · C · Julia