Nivel: Principiante
Tema: Strings, limpieza de texto, casos borde, tests con pytest
Objetivo: Contar cuántas palabras reales hay en una frase, manejando espacios extra y entradas vacías de forma segura.

Enunciado
Crea una función llamada contar_palabras(frase) que:
- Reciba un valor
frase. - Si
fraseesNone, devuelva0. - Si
fraseno es unstr, lanceTypeError. - Devuelva el número de palabras en la frase.
- Debe ignorar espacios extra (por ejemplo, múltiples espacios seguidos).
Para este reto, considera “palabra” como cualquier secuencia de caracteres separada por espacios (no hace falta manejar puntuación de forma avanzada).
Ejemplos
contar_palabras("hola mundo")→2contar_palabras(" hola mundo ")→2contar_palabras("")→0contar_palabras(" ")→0contar_palabras(None)→0contar_palabras(123)→ TypeError
Pistas
split()sin argumentos ya maneja espacios múltiples:" a b ".split()→["a", "b"]- Antes de contar, piensa en el caso de cadena vacía o solo espacios.
- Valida tipos al inicio para que la función sea predecible.
Solución explicada (paso a paso)
- Si la entrada es
None, no hay palabras: devolvemos0. - Si la entrada no es
str, lanzamosTypeError(fallar rápido). - Para contar palabras ignorando espacios extra, usamos
frase.split()(sin parámetros).
Esto divide por cualquier cantidad de espacios en blanco y descarta vacíos. - El resultado es la longitud de la lista:
len(...).
Python
def contar_palabras(frase: str | None) -> int: """ Cuenta palabras en una frase de forma segura. Reglas: - None -> 0 - No str -> TypeError - str -> número de palabras separadas por espacios (ignorando espacios extra) """ if frase is None: return 0 if not isinstance(frase, str): raise TypeError("El parámetro 'frase' debe ser una cadena (str) o None.") palabras = frase.split() return len(palabras)
Python
import pytestfrom reto_02_contar_palabras import contar_palabrasdef test_frase_normal(): assert contar_palabras("hola mundo") == 2def test_espacios_extra(): assert contar_palabras(" hola mundo ") == 2def test_cadena_vacia(): assert contar_palabras("") == 0def test_solo_espacios(): assert contar_palabras(" ") == 0def test_none_devuelve_cero(): assert contar_palabras(None) == 0def test_tipo_incorrecto_lanza_typeerror(): with pytest.raises(TypeError): contar_palabras(123)
Ejecuta:
pytest -q
Variantes para subir de nivel (opcional)
- Ignorar puntuación: “hola, mundo!” → 2 (requiere limpieza con
reostr.translate) - Contar palabras únicas: cuántas distintas aparecen
- Soportar saltos de línea y tabs:
split()ya lo hace, pero puedes añadir casos de test
Accede al código completo y a los tests en GitHub para ejecutar y modificar la solución localmente.
¿Listo para el siguiente? Continúa con Reto #3 — Encontrar el máximo en una lista.
Si publicas tu solución, incluye el comando pytest -q en tu README para validar rápidamente.