Nivel: Principiante
Tema: Strings, normalización de texto, lógica, validación de entradas, tests con pytest
Objetivo: Determinar si una frase es un palíndromo, ignorando espacios y diferencias entre mayúsculas y minúsculas.

Enunciado
Crea una función llamada es_palindromo(texto) que:
- Reciba un valor
texto. - Si
textoesNone, devuelvaFalse. - Si
textono es unstr, lanceTypeError. - Ignore espacios y mayúsculas/minúsculas.
- Devuelva
Truesi el texto es un palíndromo, oFalseen caso contrario.
Para este reto no es necesario eliminar signos de puntuación; solo ignora espacios y el uso de mayúsculas.
Ejemplos
es_palindromo("anilina")→Truees_palindromo("Anilina")→Truees_palindromo("anita lava la tina")→Truees_palindromo("hola mundo")→Falsees_palindromo("")→Truees_palindromo(None)→Falsees_palindromo(123)→ TypeError
Pistas
- Convierte el texto a minúsculas para evitar diferencias de mayúsculas.
- Elimina los espacios antes de comparar.
- Puedes invertir el texto normalizado usando slicing
[::-1]. - Compara el texto normalizado con su versión invertida.
Solución explicada (paso a paso)
- Si
textoesNone, no evaluamos →False. - Si no es una cadena, lanzamos
TypeError. - Convertimos el texto a minúsculas.
- Eliminamos los espacios (por ejemplo, con
replace(" ", "")). - Comparamos el texto limpio con su versión invertida.
- Si son iguales, es un palíndromo.
Python
def es_palindromo(texto: str | None) -> bool: """ Determina si un texto es un palíndromo ignorando espacios y mayúsculas. Reglas: - None -> False - No str -> TypeError - Ignora espacios y mayúsculas/minúsculas """ if texto is None: return False if not isinstance(texto, str): raise TypeError("El parámetro 'texto' debe ser una cadena (str) o None.") texto_limpio = texto.lower().replace(" ", "") return texto_limpio == texto_limpio[::-1]
import pytestfrom reto_06_palindromo import es_palindromodef test_palindromo_simple(): assert es_palindromo("anilina") is Truedef test_palindromo_con_mayusculas(): assert es_palindromo("Anilina") is Truedef test_palindromo_con_espacios(): assert es_palindromo("anita lava la tina") is Truedef test_no_palindromo(): assert es_palindromo("hola mundo") is Falsedef test_cadena_vacia_es_palindromo(): assert es_palindromo("") is Truedef test_none_devuelve_false(): assert es_palindromo(None) is Falsedef test_tipo_incorrecto_lanza_typeerror(): with pytest.raises(TypeError): es_palindromo(123)
Ejecuta:
pytest -q
Variantes para subir de nivel (opcional)
- Ignorar puntuación: eliminar
, . ! ?antes de comparar - Soportar acentos: normalizar caracteres (
á→a) - Comparación manual: sin usar slicing
- Devolver la versión normalizada junto al resultado
Lo que aprendiste
- Normalización básica de texto
- Comparación de cadenas de forma segura
- Manejo explícito de casos borde
- Cómo testear lógica booleana con
pytest
Accede al código completo y a los tests en GitHub para ejecutar y modificar la solución localmente.
Continúa con Reto #7 — Sumar valores en una lista (sin usar sum) para seguir reforzando bucles, acumuladores y validación de datos.