Practicar Python

12 ejercicios de Python resueltos para principiantes

Practica en el navegador con feedback inmediato. Empieza sin mirar la respuesta, usa pistas progresivas si te bloqueas y consulta después una solución explicada para entender por qué funciona.

Cómo practicar para aprender de verdad

  1. Lee el objetivo y predice qué debería cambiar antes de tocar el código.
  2. Haz un primer intento. El corrector comprueba la salida y la idea esencial del ejercicio.
  3. Si te bloqueas, abre primero la pista conceptual y después la pista más directa.
  4. Cuando lo resuelvas, compara tu enfoque con la solución razonada y explica por qué funciona.

El corrector no mira solo el resultado

Una salida correcta no siempre demuestra comprensión. El sistema revisa también la estructura esencial del código y, cuando procede, ejecuta pruebas adicionales. Así, print(42) no aprueba un ejercicio que pide calcular con variables.

Las soluciones están aquí para ayudarte, no para sustituir el intentoIntenta cada ejercicio antes de abrir la respuesta. Si fallas, usa las pistas de menor a mayor detalle. La solución incluye el código, el razonamiento y un error frecuente para que puedas comparar decisiones, no solo copiar líneas.
Tu progreso0 de 12 ejercicios resueltos

El progreso se guarda solo en este navegador. Resolver significa que la salida y el concepto comprobado son correctos.

Ejercicio 1

Saludo exacto

Haz que el programa imprima exactamente Hola, Python.

ejercicio_1.py
La salida aparecerá aquí.

Pista 1 · Orientación

Solo necesitas cambiar el valor guardado en mensaje. No hace falta modificar print().

Pista 2 · Más directa

Cambia únicamente el texto entre comillas de la primera línea por Hola, Python.

Ver solución razonada
Una solución clara
mensaje = "Hola, Python"
print(mensaje)

Por qué funciona

La asignación guarda el string exacto en mensaje. Después print(mensaje) lee ese valor. Separar dato y salida permite reutilizar o cambiar el mensaje sin tocar la llamada a print().

Error frecuente

Escribir el saludo directamente dentro de print() produciría la misma salida, pero no practicaría guardar y reutilizar un valor.

Después de acertar

Transferencia: cambia el saludo para que incluya dos datos sin escribir la frase final directamente.

Repasar el concepto en la lección →
Ejercicio 2

Suma con variables

ExpresionesFácilLección 5 · Operadores

Calcula la suma de 17 y 25 usando las variables existentes. La salida debe ser 42.

ejercicio_2.py
La salida aparecerá aquí.

Pista 1 · Orientación

Sustituye el 0 por una expresión que use a y b.

Pista 2 · Más directa

La línea que falta es una expresión de suma: resultado = a + b.

Ver solución razonada
Una solución clara
a = 17
b = 25
resultado = a + b
print(resultado)

Por qué funciona

a + b calcula a partir de los valores que ya están guardados. Si mañana cambian a o b, el programa sigue calculando la suma correcta sin modificar el resultado a mano.

Error frecuente

Escribir resultado = 42 acierta este caso, pero rompe la relación entre los datos de entrada y el cálculo.

Después de acertar

Transferencia: calcula una resta o un producto reutilizando las mismas variables.

Repasar el concepto en la lección →
Ejercicio 3

Guardar y reutilizar

Guarda Madrid en ciudad para que se imprima ese texto.

ejercicio_3.py
La salida aparecerá aquí.

Pista 1 · Orientación

Una variable referencia el valor que asignas con =.

Pista 2 · Más directa

Asigna el string con ciudad = "Madrid".

Ver solución razonada
Una solución clara
ciudad = "Madrid"
print(ciudad)

Por qué funciona

El operador = asocia el nombre ciudad con el string "Madrid". La segunda línea no necesita saber cómo se creó el valor: solo utiliza el nombre.

Error frecuente

Cambiar print(ciudad) por print("Madrid") evita precisamente la habilidad que se practica: guardar un dato y usarlo después.

Después de acertar

Transferencia: reasigna la variable una vez y predice qué valor aparecerá al final.

Repasar el concepto en la lección →
Ejercicio 4

Construir una condición

CondicionalesFácilLección 7 · if/elif/else

Con edad = 20, cambia la condición para imprimir adulto.

ejercicio_4.py
La salida aparecerá aquí.

Pista 1 · Orientación

La pregunta es: ¿edad es mayor o igual que 18? Escríbela como una expresión booleana.

Pista 2 · Más directa

Sustituye False por edad >= 18.

Ver solución razonada
Una solución clara
edad = 20
if edad >= 18:
    print("adulto")
else:
    print("menor")

Por qué funciona

La comparación edad >= 18 produce un booleano. Con 20 resulta True, por lo que Python entra en la primera rama y no ejecuta el else.

Error frecuente

Cambiar directamente el texto de la rama else puede hacer coincidir una salida, pero no crea una decisión basada en la edad.

Después de acertar

Transferencia: prueba valores 17, 18 y 19 y explica por qué el límite cambia de rama.

Repasar el concepto en la lección →
Ejercicio 5

Ajustar un rango

BuclesFácilLección 8 · for

Haz que el bucle imprima 1, 2 y 3, cada uno en una línea.

ejercicio_5.py
La salida aparecerá aquí.

Pista 1 · Orientación

El límite final de range no se incluye.

Pista 2 · Más directa

Para obtener 1, 2 y 3, el límite final debe ser 4 porque range() no lo incluye.

Ver solución razonada
Una solución clara
for n in range(1, 4):
    print(n)

Por qué funciona

range(1, 4) genera 1, 2 y 3. El segundo límite marca dónde detenerse, pero ese valor no forma parte del recorrido.

Error frecuente

Usar range(1, 3) parece natural si piensas en “desde 1 hasta 3”, pero Python excluye el límite superior.

Después de acertar

Transferencia: consigue 2, 3 y 4 sin imprimir números manualmente.

Repasar el concepto en la lección →
Ejercicio 6

Medir una colección

Imprime cuántos elementos contiene la lista datos.

ejercicio_6.py
La salida aparecerá aquí.

Pista 1 · Orientación

Python ya tiene una función que devuelve la longitud de una colección.

Pista 2 · Más directa

Usa len(datos) para obtener el número de elementos.

Ver solución razonada
Una solución clara
datos = [4, 8, 15, 16]
resultado = len(datos)
print(resultado)

Por qué funciona

len() pregunta a la colección cuántos elementos contiene. No depende de conocer la lista de memoria y seguirá funcionando si añades o eliminas datos.

Error frecuente

Asignar resultado = 4 solo funciona para esta lista concreta y pierde la relación con la colección.

Después de acertar

Transferencia: añade un elemento y predice la nueva longitud antes de ejecutar.

Repasar el concepto en la lección →
Ejercicio 7

Devolver un resultado

Completa cuadrado(n) para que cuadrado(5) produzca 25.

ejercicio_7.py
La salida aparecerá aquí.

Pista 1 · Orientación

La función debe devolver el producto de n por sí mismo, no imprimirlo dentro.

Pista 2 · Más directa

Dentro de la función, devuelve n * n.

Ver solución razonada
Una solución clara
def cuadrado(n):
    return n * n

print(cuadrado(5))

Por qué funciona

return entrega al código que llamó a la función un resultado reutilizable. Multiplicar n * n hace que la función funcione para cualquier número, no solo para 5.

Error frecuente

Escribir return 25 supera el ejemplo visible, pero falla para otros argumentos. El corrector ejecuta casos adicionales para detectar ese atajo.

Después de acertar

Transferencia: convierte la función en cubo(n) y comprueba con dos argumentos distintos.

Repasar el concepto en la lección →
Ejercicio 8

Acceder por clave

Obtén el valor asociado a la clave lenguaje e imprímelo.

ejercicio_8.py
La salida aparecerá aquí.

Pista 1 · Orientación

Accede al diccionario con corchetes y la clave exacta.

Pista 2 · Más directa

Usa datos["lenguaje"] para leer la clave.

Ver solución razonada
Una solución clara
datos = {"lenguaje": "Python", "nivel": "inicial"}
valor = datos["lenguaje"]
print(valor)

Por qué funciona

Un diccionario asocia claves con valores. Los corchetes piden el valor guardado exactamente bajo la clave "lenguaje", que en este caso es "Python".

Error frecuente

Escribir valor = "Python" ignora el diccionario; si el dato cambiara dentro de datos, tu programa seguiría mostrando el valor antiguo.

Después de acertar

Transferencia: añade otra clave y recupera su valor sin recorrer el diccionario.

Repasar el concepto en la lección →
Ejercicio 9

Limpiar texto

Convierte el texto en python: sin espacios exteriores y en minúsculas.

ejercicio_9.py
La salida aparecerá aquí.

Pista 1 · Orientación

Puedes encadenar métodos: uno elimina espacios de los extremos y otro transforma a minúsculas.

Pista 2 · Más directa

Encadena texto.strip().lower().

Ver solución razonada
Una solución clara
texto = "  Python  "
resultado = texto.strip().lower()
print(resultado)

Por qué funciona

strip() crea un string sin espacios en los extremos y lower() transforma ese resultado a minúsculas. Como los strings son inmutables, guardamos el nuevo valor en resultado.

Error frecuente

strip() no cambia la variable original por sí solo; si ignoras el valor que devuelve, los espacios seguirán presentes.

Después de acertar

Transferencia: prueba un texto con mayúsculas internas y explica qué cambia y qué no.

Repasar el concepto en la lección →
Ejercicio 10

Filtrar pares

Bucles + listasMedioLecciones 8 y 12

Construye pares para imprimir exactamente [2, 4, 6].

ejercicio_10.py
La salida aparecerá aquí.

Pista 1 · Orientación

Dentro del bucle, comprueba si el resto de dividir entre 2 es cero y añade el número con append.

Pista 2 · Más directa

Dentro del for, usa if n % 2 == 0: y dentro añade n con pares.append(n).

Ver solución razonada
Una solución clara
numeros = [1, 2, 3, 4, 5, 6]
pares = []
for n in numeros:
    if n % 2 == 0:
        pares.append(n)

print(pares)

Por qué funciona

El operador % devuelve el resto. Un entero es par cuando el resto de dividirlo entre 2 es 0. Solo esos valores se añaden a la nueva lista.

Error frecuente

Construir directamente [2, 4, 6] da la salida correcta para estos datos, pero no filtra una colección nueva.

Después de acertar

Transferencia: construye ahora la lista de impares sin copiar la condición anterior.

Repasar el concepto en la lección →
Ejercicio 11

Validar una conversión

Si el texto no puede convertirse a entero, imprime dato no válido.

ejercicio_11.py
La salida aparecerá aquí.

Pista 1 · Orientación

El tipo de excepción ya es el adecuado. Solo corrige el comportamiento del bloque except.

Pista 2 · Más directa

El try ya está bien. Cambia el texto del print() dentro de except ValueError.

Ver solución razonada
Una solución clara
texto = "doce"

try:
    numero = int(texto)
    print(numero)
except ValueError:
    print("dato no válido")

Por qué funciona

int("doce") no puede construir un entero y lanza ValueError. El bloque except ValueError captura específicamente ese fallo y permite responder con un mensaje controlado.

Error frecuente

Capturar Exception sería demasiado amplio: también ocultaría fallos que no tienen que ver con una conversión inválida.

Después de acertar

Transferencia: cambia el texto a "12" y predice qué bloque deja de ejecutarse.

Repasar el concepto en la lección →
Ejercicio 12

Contar por categoría

Completa el bucle para obtener {'a': 3, 'b': 2}.

ejercicio_12.py
La salida aparecerá aquí.

Pista 1 · Orientación

Para cada letra necesitas leer el conteo anterior o usar cero si aún no existe. dict.get(clave, 0) puede ayudarte.

Pista 2 · Más directa

Dentro del bucle usa conteo[letra] = conteo.get(letra, 0) + 1.

Ver solución razonada
Una solución clara
letras = ["a", "b", "a", "a", "b"]
conteo = {}

for letra in letras:
    conteo[letra] = conteo.get(letra, 0) + 1

print(conteo)

Por qué funciona

get(letra, 0) devuelve el conteo actual y usa 0 cuando la clave aún no existe. Después sumamos 1 y guardamos el nuevo valor bajo esa misma letra.

Error frecuente

Inicializar manualmente {"a": 3, "b": 2} no escala a datos distintos. El objetivo es construir el resultado mientras recorres la entrada.

Después de acertar

Transferencia: añade la letra "c" dos veces y anticipa el diccionario final.

Repasar el concepto en la lección →

Cómo usar una solución sin convertirla en copia

1. Compara decisiones

No preguntes solo “¿es igual a mi código?”. Busca qué dato entra, qué operación se realiza y qué valor sale.

2. Explícala sin mirar

Cierra la solución y describe con tus palabras por qué cada línea es necesaria. Si no puedes, todavía hay algo que reconstruir.

3. Cambia los datos

Haz el reto de transferencia o inventa otra entrada. Una idea comprendida funciona fuera del ejemplo original.

¿Ya salen todos?Vuelve mañana o dentro de unos días e intenta resolver 3 al azar sin mirar tu solución anterior. La recuperación espaciada revela mejor qué ideas ya puedes usar con autonomía.