SolveConPython

Python Reto #2 — Contar palabras en una frase

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.

Python Reto #2 Contar palabras en frase
Python Reto #2 Contar palabras en frase

Enunciado

Crea una función llamada contar_palabras(frase) que:

  1. Reciba un valor frase.
  2. Si frase es None, devuelva 0.
  3. Si frase no es un str, lance TypeError.
  4. Devuelva el número de palabras en la frase.
  5. 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")2
  • contar_palabras(" hola mundo ")2
  • contar_palabras("")0
  • contar_palabras(" ")0
  • contar_palabras(None)0
  • contar_palabras(123)TypeError

Pistas

  1. split() sin argumentos ya maneja espacios múltiples: " a b ".split()["a", "b"]
  2. Antes de contar, piensa en el caso de cadena vacía o solo espacios.
  3. Valida tipos al inicio para que la función sea predecible.

Solución explicada (paso a paso)

  1. Si la entrada es None, no hay palabras: devolvemos 0.
  2. Si la entrada no es str, lanzamos TypeError (fallar rápido).
  3. 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.
  4. 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 pytest
from reto_02_contar_palabras import contar_palabras
def test_frase_normal():
assert contar_palabras("hola mundo") == 2
def test_espacios_extra():
assert contar_palabras(" hola mundo ") == 2
def test_cadena_vacia():
assert contar_palabras("") == 0
def test_solo_espacios():
assert contar_palabras(" ") == 0
def test_none_devuelve_cero():
assert contar_palabras(None) == 0
def test_tipo_incorrecto_lanza_typeerror():
with pytest.raises(TypeError):
contar_palabras(123)

Ejecuta:

  • pytest -q

Variantes para subir de nivel (opcional)

  1. Ignorar puntuación: “hola, mundo!” → 2 (requiere limpieza con re o str.translate)
  2. Contar palabras únicas: cuántas distintas aparecen
  3. 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.