Domina Python Practicando es un tutorial interactivo con 47 ejercicios de código que resuelves dentro de VS Code, más una página de bienvenida. 43 se corrigen solos con pytest y todos traen una solución de referencia. Se completa en unas 10 horas y va de la aritmética con enteros y el manejo de dígitos a las expresiones regulares, los generadores y la programación orientada a objetos con herencia, métodos estáticos y métodos de clase.
- Dificultad: declarada como
easyen learn.json, aunque el rango es amplio: el ejercicio 001 es un soloprint()y el 045 es un método de clase con una variable de clase. - Duración: 10 horas (
"duration": 10en learn.json). - Ejercicios: 48 carpetas dentro de
exercises/— 1 página de bienvenida y 47 ejercicios de código. - Corrección automática: sí,
"graded": true. 43 de los 47 ejercicios de código incluyen una batería de teststest.py. - Tecnologías: Python 3 (el dev container fija la 3.10), pytest 6.2.5, pytest-testdox, mock y LearnPack sobre Node.js 22.
- Soluciones en vídeo: no hay (
"videoSolutions": false), pero los 47 ejercicios de código traen un archivosolution.hide.py. - Instrucciones disponibles en: English y Español — las 48 carpetas llevan
README.mdyREADME.es.md.
Los ejercicios están ordenados para que cada bloque se apoye en el anterior:
- Aritmética con enteros y decimales: división entera
//, módulo%, potencia**,round()y el módulomath(importado en 6 de las soluciones de referencia). - Manejo de dígitos sin pasar por texto: sacar la cifra de las decenas, sumar los dígitos de un número de tres cifras, intercambiar dígitos, leer la cifra que va justo después de la coma decimal.
- Listas, tuplas y diccionarios: construir un diccionario de cuadrados, generar una matriz de dos dimensiones, convertir un número indefinido de argumentos en una lista y en una tupla a la vez, contar la frecuencia de palabras.
- Ordenación por varias claves:
from operator import itemgetterpara ordenar tuplas(nombre, edad, nota)por tres criterios con prioridad. - Bases numéricas: convertir cadenas binarias de 4 dígitos con
int(binario, 2). - Expresiones regulares:
import reyre.search()para validar una contraseña contra seis reglas a la vez. - Generadores: una clase con una función generadora que usa
yieldpara recorrer los múltiplos de 7. - Programación orientada a objetos:
__init__,__str__, herencia consuper(), polimorfismo sobrescribiendo un método del padre,@staticmethody@classmethodcon variables de clase.
Hay dos temas que no aparecen: no se toca el manejo de errores con try/except ni la lectura o escritura de ficheros en ninguna de las 48 carpetas (comprobado en todos los README.md, app.py y solution.hide.py). La recursividad y async tampoco salen.
47 programas pequeños en Python, cada uno en su carpeta numerada. Los tres bloques:
Ejercicios 001 a 022 — 23 problemas numéricos (la carpeta 006.1 desdobla uno de ellos). Escribes digits_sum(), que debe devolver 17 para la entrada 854; day_of_week(), que devuelve 4 para el día 1 de un año que empieza en jueves; digital_clock(), que convierte 150 minutos después de medianoche en (2, 30); square_root(), que devuelve 7.07 para 50; además de un factorial, un cálculo de siglo, un reparto de manzanas y una ruta de coche.
Ejercicios 023 a 041 — 19 problemas de estructuras de datos y algoritmos (dos de ellos, el 024 y el 039, ya te piden escribir una clase). two_dimensional_list(3, 5) tiene que devolver [[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 2, 4, 6, 8]]. divisible_binary("0100,0011,1010,1001") tiene que devolver la cadena "1010". computed_value(9) tiene que devolver 11106, la suma de 9 + 99 + 999 + 9999. net_amount("D 300 D 300 W 200 D 100") tiene que devolver 500. valid_password("ABd1234@1") tiene que devolver exactamente la cadena "Valid password". compute_robot_distance(["UP 5", "DOWN 3", "LEFT 3", "RIGHT 2"]) tiene que devolver 2. Y compute_word_frequency() tiene que informar Python:5 para la frase de ejemplo.
Ejercicios 042 a 045 — 5 ejercicios de orientación a objetos. Construyes una clase Student, le añades __init__ y __str__ a una clase Book, extiendes Student en un CollegeStudent con un atributo major y un método attend_lecture(), y terminas con una clase MathOperations con un add_numbers() estático y un método de clase calculate_circle_area() que devuelve 78.53975 para un radio de 5.
No necesitas instalar nada si abres el repositorio en GitHub Codespaces: el dev container ya provisiona Python 3.10, Node.js 22, pytest y el plugin de Python de LearnPack.
Lo que sí necesitas es Python previo: esta es la cuarta y última serie de un recorrido, y la página de bienvenida te remite a las tres anteriores.
- Python para principiantes — variables,
print(), condicionales. - Practica funciones — parámetros, valores de retorno, ámbito.
- Practica bucles y listas —
for,while, manejo de listas.
Si ya sabes declarar una función y recorrer una lista, puedes empezar por aquí sin más. El ejercicio 001 sigue siendo un print("Hello World") a secas, así que la entrada es suave.
Cada ejercicio corregido lleva un test.py escrito con pytest. Cada comprobación va etiquetada con @pytest.mark.it("...") y pytest-testdox imprime esas etiquetas como frases legibles, así que un fallo te dice qué se esperaba en vez de soltarte un traceback.
Las baterías comprueban dos cosas distintas según el ejercicio:
- Valores devueltos. En
013-sum_of_digitslos tests verifican quedigits_sumexiste y es invocable, que devuelve algo, que el tipo devuelto esinty, por último, quedigits_sum(854) == 17. - Lo que se imprime. En
001-hello_worldel test captura la salida estándar y la compara carácter a carácter con"Hello World\n".
Cuatro ejercicios no tienen test.py y son práctica libre: 031-sum-eigth-digit, 033-number-of-uppercase, 035-square-each-odd-number y 039-class-that-iterates. Es decir, 43 corregidos de 47.
💡 La corrección es estricta a propósito, y los propios mantenedores del repositorio lo advierten: toma un test en rojo como una pista sobre la forma que se espera de tu respuesta, no como un veredicto sobre tu lógica.
- Imprimir cuando el test espera un
return. La mayoría de las baterías llaman a tu función y miran el valor que devuelve.digits_sum(854)tiene que devolver 17; imprimir 17 falla la comprobación de tipo. - Fiarte del enunciado en vez del test en los ejercicios 019 y 030. Las instrucciones de
019-digital_clockdicen que la función debe imprimir dos números, pero su test compruebadigital_clock(194) == (3, 14). La misma trampa está en030-divisable-binary: el enunciado dice imprimir los números divisibles entre 5, mientras que el test compruebadivisible_binary("0100,0011,1010,1001") == "1010". En los dos hay que devolver el valor. - Formatear el ejercicio 041 línea a línea. El enunciado pide una clave por línea, pero el test compara la salida contra una sola línea:
"2:2 3.:1 3?:1 New:1 Python:5 Read:1 and:1 between:1 choosing:1 or:2 to:1\n". Fíjate en que no hay espacio después de los dos puntos. - Olvidar
import reen el ejercicio 037, y olvidar que las reglas de la contraseña incluyen los dos límites: mínimo 6 caracteres y máximo 12. La cadena de fallo tiene que ser exactamente"Invalid password. Please try again". - Cambiar filas por columnas en el ejercicio 026.
two_dimensional_list(3, 5)devuelve 3 filas de 5 elementos, no 5 filas de 3. - Redondear con la precisión equivocada. El ejercicio 021 se queda con dos decimales (
square_root(50)da7.07); el 040 redondea la distancia del robot al entero más cercano. - Confundir métodos estáticos con métodos de clase. Un
@staticmethod(ejercicio 044) no recibe niselfniclsy no puede leer el estado de la clase; un@classmethod(ejercicio 045) recibecls, y eso es lo que permite quecalculate_circle_area()llegue a la variable de clasepi. - Cambiarle el nombre a la función. La primera comprobación de casi todas las baterías es
assert callable(app.<nombre>), así que una errata en el nombre tumba todo lo que viene detrás.
El tutorial declara 10 horas. Repartidas entre 47 ejercicios de código salen unos 13 minutos de media, pero la distribución es desigual: el bloque numérico (001–022) va rápido en cuanto dominas // y %, mientras que los de expresiones regulares, ordenación y objetos cuestan bastante más.
Algo sí. Esta es la última serie de un recorrido de cuatro, y la página de bienvenida da por sabidos las variables, las funciones, los bucles y las listas. No necesitas base de orientación a objetos: la teoría se explica desde cero en el ejercicio 042, con un ejemplo resuelto de la clase Student antes de pedirte que escribas nada. Eso sí, avisamos: hay dos ejercicios anteriores que ya dan por hecho que sabes escribir una clase casi sin explicación previa, el 024-class-with-two-methods (que además está corregido) y el 039-class-that-iterates.
Abrirlo y resolverlo no cuesta nada. Reutilizar el contenido sí tiene condiciones: LICENSE.md reserva todos los derechos de propiedad intelectual y prohíbe expresamente republicar, vender, sublicenciar, reproducir o redistribuir el material. No es una licencia de código abierto. El Python que escribas en tus propios app.py es tuyo.
No. Abrir el repositorio en Codespaces te da un entorno listo. La instalación local también es posible y está documentada más abajo: necesita Python 3, Node.js y el plugin de Python de LearnPack.
No. learn.json pone videoSolutions en false. Lo que sí tienes es un archivo solution.hide.py en cada una de las 47 carpetas de código, además de las pistas al final de la mayoría de los ejercicios (39 de las 48 carpetas llevan sección de pistas), que enlazan a referencias externas como las lecciones de snakify sobre números enteros y decimales.
Los ejercicios apuntan a la mecánica que una entrevista o una revisión de código siguen mirando: razonar con división entera en lugar de convertir a texto, elegir el contenedor adecuado, ordenar por varias claves y entender por qué un método está atado a la clase y no a la instancia. Eso no caduca. Lo que esta serie no enseña es manejo de errores, ficheros ni ninguna librería de terceros.
El camino más rápido es un clic: abrir este tutorial en GitHub Codespaces. También existe la alternativa de Gitpod.
Cuando se abra VS Code, los ejercicios de LearnPack deberían arrancar solos. Si no lo hacen, ejecuta esto en la terminal:
learnpack start- Instala LearnPack y el plugin de Python, con las mismas versiones que provisiona el dev container:
npm i @learnpack/learnpack@5.0.348 -g && learnpack plugins:install @learnpack/python@1.0.6- Clona el repositorio y entra en él:
git clone https://github.com/4GeeksAcademy/master-python-programming-exercises.git
cd master-python-programming-exercises- Instala las dependencias de test y arranca el tutorial desde la misma carpeta donde está
learn.json:
pip3 install pytest==6.2.5 pytest-testdox mock
learnpack startCada ejercicio es una carpeta dentro de exercises/ y contiene hasta cinco archivos:
app.py— el archivo que editas y el que ejecuta el ordenador. Está en los 47 ejercicios de código.README.md— las instrucciones, en inglés.README.es.md— las mismas instrucciones en español. Está en las 48 carpetas.test.py— la batería de pytest. No hace falta que lo abras. Está en 43 carpetas.solution.hide.py— una solución de referencia. Está en los 47 ejercicios de código.
La carpeta 000-welcome solo tiene los dos READMEs: es la página de introducción, no un ejercicio.
¿Encuentras un fallo o una errata? Abre una incidencia en este repositorio — los ejercicios se construyeron en colaboración y los reportes son bienvenidos.
Gracias a estas personas (leyenda de emojis):
- Alejandro Sánchez (alesanchezr) — código 💻, idea 🤔, tests
⚠️ , revisión de pull requests 👀, construcción del tutorial ✅, documentación 📖 - Paolo (plucodev) — reportes de fallos 🐛, código 💻, traducción 🌎
- Marco Gómez (marcogonzalo) — reportes de fallos 🐛, traducción 🌎
Y a todo el mundo que aparece en el gráfico de colaboradores. Este proyecto sigue la especificación all-contributors y toda contribución es bienvenida.
Este tutorial es uno de tantos construidos por alumnos y profesores de 4Geeks Academy.