Python es el lenguaje con el que más gente aprende a programar, y también con el que se entrena buena parte de la inteligencia artificial que hoy escribe código. Es fácil de empezar y tiene unas cuantas trampas que no se ven hasta el tercer mes. Este curso va de las dos cosas.
La ruta: diez lecciones
Pensadas para leerse en orden. Las dos primeras están aquí mismo; y las otras ocho tienen la suya.
- 1Instalación y primer programaEl intérprete, un guion, y los entornos virtuales, que hay que entender el primer día.En esta página
- 2Dinámico, pero de tipado fuerteQué significa eso exactamente, por qué la sangría es obligatoria y cómo leer los errores.En esta página
3Cadenas, números y f-stringsFormato, métodos de texto, enteros sin límite y los decimales que no suman.Leer lección →
4Listas, tuplas, diccionarios y conjuntosLas cuatro estructuras que resuelven el 95 % de los problemas.Leer lección →
5Control de flujo y comprensionesif, for, while, y la línea que sustituye a cinco.Leer lección →
6FuncionesArgumentos con nombre, *args, valores por omisión y la trampa del mutable.Leer lección →
7Clases y dataclassesObjetos sin ceremonia, y el decorador que escribe el constructor por ti.Leer lección →
8Errores y excepcionestry, except, else, finally, y cómo no tragarse los fallos.Leer lección →
9Archivos, rutas y JSONpathlib en vez de os.path, lectura segura y serialización.Leer lección →
10Un proyecto de verdadEstructura, pytest, pyproject.toml y publicar un paquete.Leer lección →
Por qué Python se siente distinto
Lo primero que choca es que la sangría es parte de la sintaxis. No hay llaves ni end: lo que está dentro de un if se sabe porque está más a la derecha. Es la decisión más discutida del lenguaje y, con el tiempo, la que hace que todo el código de Python del mundo se parezca.
Lo segundo es que no se declara el tipo de nada, pero eso no significa que los tipos den igual: hay poco que se convierta solo. Lo veremos en la lección 2, que es donde está la mitad de los malentendidos.
Y lo tercero, que explica mucho de lo demás: Python se escribió para que el código sea agradable de leer. Cuando dos formas de hacer algo compiten, el lenguaje suele quedarse con la que se lee mejor, aunque sea más lenta. Si vienes de C o de Java, eso implica que muchas cosas que allí se escriben con un bucle aquí se escriben con una línea, y que esa línea es la que se espera de ti.
Lección 1: el primer programa
En Linux y macOS ya viene instalado, aunque puede ser una versión vieja. En Debian o Ubuntu, sudo apt install python3 python3-venv; en Fedora, sudo dnf install python3; en Windows, desde python.org marcando la casilla de «Add to PATH». Comprueba cuál tienes:
python3 -VV
salidaPython 3.14.8 (main, Oct 6 2026, 01:59:23) [GCC 14.2.0]
python a secas no existe o te da la versión 2, no te asustes. Durante años convivieron dos Pythons incompatibles, y muchos sistemas reservaron python para el viejo. Escribe siempre python3 y pip3, o usa un entorno virtual, que es lo que recomendamos aquí abajo y resuelve el problema de raíz.Tres formas de ejecutar algo
El intérprete interactivo, escribiendo python3 a secas. Escribes una expresión, pulsas Enter y te responde. Es el mejor sitio para una duda de dos minutos, y desde Python 3.13 tiene colores, historial y edición multilínea decentes.
Un guion. Un archivo saluda.py con esto dentro:
nombre = input("¿Cómo te llamas? ")
print(f"Hola, {nombre}.")
python3 saluda.py
salida¿Cómo te llamas? Ana Hola, Ana.
No hay main, ni clase, ni punto de entrada: el archivo es el programa y se ejecuta de arriba abajo. Esa f delante de las comillas convierte la cadena en una f-string, y lo que va entre llaves se evalúa y se inserta. Es la forma de componer texto en Python y la verás en todas partes.
Y una orden del sistema, si le pones #!/usr/bin/env python3 como primera línea y le das permiso de ejecución.
Los entornos virtuales, que no son opcionales
Esto es lo que más tropiezos causa el primer mes, así que va en la lección 1 y no en la novena.
python3 -m venv .venv source .venv/bin/activate # en Windows: .venv\Scripts\activate pip install requests
salidawhich python3: /home/ana/.venv/bin/python3 pip 26.2.1 from /home/ana/.venv/lib/python3.14/site-packages/pip (python 3.14) requests 2.34.2
Y lo interesante, al salir del entorno con deactivate:
salidaModuleNotFoundError: No module named 'requests'
Un entorno virtual es una carpeta con su propio Python y sus propias bibliotecas. Sin él, todo lo que instalas va a parar al Python del sistema, dos proyectos que necesiten versiones distintas de la misma biblioteca se pelean, y acabas rompiendo herramientas del sistema operativo que dependen de ese Python.
.venv fuera del control de versiones. Lo que se guarda es la lista de dependencias, no la carpeta. Si prefieres algo más moderno y bastante más rápido, uv hace lo mismo y además resuelve e instala en segundos; pero conviene entender primero qué está pasando por debajo.Lección 2: dinámico, pero de tipado fuerte
Son dos cosas distintas y se confunden constantemente.
x = 5
print(f"x = {x}, de tipo {type(x).__name__}")
x = "ahora soy texto"
print(f"x = {x!r}, de tipo {type(x).__name__}")
salidax = 5, de tipo int x = 'ahora soy texto', de tipo str
Eso es dinámico: una variable es solo un nombre, y puede apuntar hoy a un número y mañana a un texto. No se declara nada.
print(1 + "1")
salidaTypeError: unsupported operand type(s) for +: 'int' and 'str'
Y eso es de tipado fuerte: Python no se inventa conversiones. En JavaScript, 1 + "1" da "11"; aquí da un error, y es una buena noticia. Lo que sí hace es lo que no tiene ambigüedad:
salida1 + 1.0 = 2.0 y 'ab' * 3 = ababab
Todo es un objeto
def saluda(nombre):
return f"hola, {nombre}"
otro_nombre = saluda
print(otro_nombre("Ana"))
print((5).bit_length())
salidauna función es un objeto: <function saluda at 0x7b3b039733d0> asignada a otra variable: hola, Ana hasta los enteros: (5).bit_length() = 3
Las funciones se pueden guardar en una variable, meter en una lista o pasar como argumento, porque son objetos como cualquier otro. Y los enteros tienen métodos. Esto, que parece una curiosidad, es la base de media biblioteca estándar.
La sangría
def mal():
print("esto no funciona")
salidaFile "P2.py", line 2
print("esto no funciona")
^^^^^
IndentationError: expected an indented block after function definition on line 1
y si mezclas nivelesFile "P3.py", line 3
print("con otra sangría")
^
IndentationError: unindent does not match any outer indentation level
Cuatro espacios por nivel, y espacios, no tabuladores: mezclarlos da errores que no se ven al mirar el archivo. Cualquier editor se configura para hacerlo solo.
Leer los errores, que aquí son buenos
salidaNameError: name 'valor_importnte' is not defined. Did you mean: 'valor_importante'?
salidaAttributeError: module 'math' has no attribute 'sqrtt'. Did you mean: 'sqrt'?
except AttributeError as e: print(e), el mensaje se queda en module 'math' has no attribute 'sqrtt', sin el «Did you mean». Las flechas ^^^^ que señalan el trozo exacto de la línea tampoco salen al imprimir la excepción a mano.La costumbre más útil al empezar: leer la traza de abajo arriba. La última línea dice qué pasó; la penúltima, dónde. Lo de arriba es el camino que se siguió hasta allí, y casi siempre sobra.
Cómo está hecho este curso
Todo el código se ejecutó con Python 3.14.8 en un contenedor limpio antes de publicarlo, y las salidas están copiadas de esa ejecución. Cuando algo dice «esto falla», es porque se ejecutó y se copió el error literal: las trazas de arriba son las de verdad.
¿Buscas una receta concreta en vez de una lección? En Ejemplos de Python hay dos docenas: archivos, XML, Excel, bases de datos, OpenCV. Y si quieres comparar, están el curso de Java, el de Go y el de Rust.