SolveConPython

Python Reto #9 — Contar vocales en una cadena

Nivel: Principiante
Tema: Strings, bucles, condicionales, normalización básica, validación de entradas, tests con pytest
Objetivo: Contar cuántas vocales hay en una cadena, ignorando mayúsculas y manejando entradas inválidas de forma segura.

Reto #9 Contar vocales en una cadena
Reto #9 Contar vocales en una cadena

Enunciado

Crea una función llamada contar_vocales(texto) que:

  1. Reciba un valor texto.
  2. Si texto es None, devuelva 0.
  3. Si texto no es un str, lance TypeError.
  4. Ignore mayúsculas/minúsculas.
  5. Cuente solo las vocales a, e, i, o, u.
  6. Devuelva el número total de vocales encontradas.

Para este reto no es necesario contar vocales con acento.

Ejemplos

  • contar_vocales("hola")2
  • contar_vocales("PYTHON")1
  • contar_vocales("Anita lava la tina")8
  • contar_vocales("")0
  • contar_vocales(None)0
  • contar_vocales(123)TypeError

Pistas

  1. Convierte el texto a minúsculas.
  2. Define una colección de vocales ("aeiou" o un set).
  3. Recorre el texto carácter por carácter y suma cuando sea vocal.

Solución explicada (paso a paso)

  1. Si el texto es None, no hay vocales → 0.
  2. Si la entrada no es una cadena, lanzamos TypeError.
  3. Convertimos el texto a minúsculas para unificar comparaciones.
  4. Recorremos cada carácter:
    • si pertenece al conjunto de vocales, incrementamos el contador.
  5. Devolvemos el total acumulado.

Ejecuta:

  • pytest -q

Variantes para subir de nivel (opcional)

  1. Soportar vocales con acento: á, é, í, ó, ú
  2. Devolver frecuencia por vocal: {a: 3, e: 1, ...}
  3. Usar comprensión de listas
  4. Ignorar caracteres no alfabéticos

Lo que aprendiste

  • Uso de sets para búsquedas eficientes
  • Normalización de texto
  • Contadores simples
  • Tests para lógica iterativa

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

Continúa con Reto #10 — Normalizar nombres (trim + title case) para seguir mejorando el manejo de strings y entradas del usuario.