SolveConPython

Python Reto #10 — Normalizar nombres (trim + title case)

Nivel: Principiante
Tema: Strings, limpieza de entradas, normalización de texto, validación de datos, tests con pytest
Objetivo: Normalizar nombres ingresados por el usuario eliminando espacios extra y aplicando formato consistente.

Reto #10 Normalizar nombres (trim + title case)
Reto #10 Normalizar nombres (trim + title case)

Enunciado

Crea una función llamada normalizar_nombre(nombre) que:

  1. Reciba un valor nombre.
  2. Si nombre es None, devuelva una cadena vacía "".
  3. Si nombre no es un str, lance TypeError.
  4. Elimine espacios al inicio y al final.
  5. Reduzca múltiples espacios internos a un solo espacio.
  6. Convierta el nombre a Title Case (primera letra en mayúscula por palabra).

Ejemplos

  • normalizar_nombre("juan perez")"Juan Perez"
  • normalizar_nombre(" juan perez ")"Juan Perez"
  • normalizar_nombre("MARIA lopez")"Maria Lopez"
  • normalizar_nombre("")""
  • normalizar_nombre(None)""
  • normalizar_nombre(123)TypeError

Pistas

  1. strip() elimina espacios al inicio y al final.
  2. split() sin argumentos elimina espacios extra.
  3. join() permite reconstruir el texto con un solo espacio.
  4. title() convierte cada palabra a formato Título.

Solución explicada (paso a paso)

  1. Si el nombre es None, devolvemos "".
  2. Si no es una cadena, lanzamos TypeError.
  3. Eliminamos espacios al inicio y al final.
  4. Dividimos el texto con split() para eliminar espacios múltiples.
  5. Unimos las palabras con un solo espacio.
  6. Aplicamos title() para capitalizar cada palabra.

Python
def normalizar_nombre(nombre: str | None) -> str:
"""
Normaliza un nombre eliminando espacios extra y aplicando Title Case.
Reglas:
- None -> ""
- No str -> TypeError
- Elimina espacios extra
- Aplica Title Case por palabra
"""
if nombre is None:
return ""
if not isinstance(nombre, str):
raise TypeError("El parámetro 'nombre' debe ser una cadena (str) o None.")
palabras = nombre.strip().split()
nombre_normalizado = " ".join(palabras)
return nombre_normalizado.title()

Python
import pytest
from reto_10_normalizar_nombre import normalizar_nombre
def test_nombre_simple():
assert normalizar_nombre("juan perez") == "Juan Perez"
def test_espacios_extra():
assert normalizar_nombre(" juan perez ") == "Juan Perez"
def test_mayusculas_y_minusculas():
assert normalizar_nombre("MARIA lopez") == "Maria Lopez"
def test_cadena_vacia():
assert normalizar_nombre("") == ""
def test_none_devuelve_cadena_vacia():
assert normalizar_nombre(None) == ""
def test_tipo_incorrecto_lanza_typeerror():
with pytest.raises(TypeError):
normalizar_nombre(123)

Ejecuta:

  • pytest -q

Variantes para subir de nivel (opcional)

  1. Soportar apellidos compuestos: “de la cruz”
  2. Mantener partículas en minúscula: de, la, y
  3. Soportar guiones: “juan-perez”
  4. Normalización internacional (acentos)

Lo que aprendiste

  • Limpieza de entradas del usuario
  • Normalización de texto realista
  • Uso combinado de strip, split, join
  • Escritura de funciones predecibles y testeables

Accede al código completo y a los tests en GitHub para ejecutar y modificar la solución localmente.

Con este reto completas los 10 primeros retos de Principiante.
Continúa con Reto #11 — Validar email (reglas simples) para empezar a trabajar con validación más realista.