Nivel: Principiante
Tema: Condicionales, bucles, claridad de código, funciones puras, tests con pytest
Objetivo: Implementar FizzBuzz de forma clara, predecible y fácil de testear, evitando “scripts mágicos” y favoreciendo funciones pequeñas.

Enunciado
Crea una función llamada fizzbuzz(n) que:
- Reciba un valor
n. - Si
nesNone, lanceTypeError. - Si
nno es un entero (int), lanceTypeError. - Devuelva:
"FizzBuzz"sines divisible por 3 y 5,"Fizz"si es divisible solo por 3,"Buzz"si es divisible solo por 5,- el propio número
nen cualquier otro caso.
No imprimas resultados. La función debe devolver un valor.
Ejemplos
fizzbuzz(3)→"Fizz"fizzbuzz(5)→"Buzz"fizzbuzz(15)→"FizzBuzz"fizzbuzz(7)→7fizzbuzz(0)→"FizzBuzz"fizzbuzz(None)→ TypeErrorfizzbuzz("3")→ TypeError
Pistas
- El orden de las condiciones importa: comprueba primero el caso “3 y 5”.
- Usa el operador módulo
%para verificar divisibilidad. - Mantén la función pequeña y sin efectos secundarios.
Solución explicada (paso a paso)
- Validamos que
nno seaNoney sea un entero. - Comprobamos primero si es divisible por 3 y 5.
- Luego comprobamos divisibilidad por 3.
- Luego por 5.
- Si no cumple ninguna condición, devolvemos el número original.
Python
def fizzbuzz(n: int) -> int | str: """ Devuelve Fizz, Buzz, FizzBuzz o el número según reglas clásicas. Reglas: - n debe ser int - 3 y 5 -> "FizzBuzz" - 3 -> "Fizz" - 5 -> "Buzz" - otro -> n """ if n is None or not isinstance(n, int): raise TypeError("El parámetro 'n' debe ser un entero (int).") if n % 15 == 0: return "FizzBuzz" if n % 3 == 0: return "Fizz" if n % 5 == 0: return "Buzz" return n
Python
import pytestfrom reto_08_fizzbuzz import fizzbuzzdef test_fizz(): assert fizzbuzz(3) == "Fizz"def test_buzz(): assert fizzbuzz(5) == "Buzz"def test_fizzbuzz(): assert fizzbuzz(15) == "FizzBuzz"def test_numero_normal(): assert fizzbuzz(7) == 7def test_cero_es_fizzbuzz(): assert fizzbuzz(0) == "FizzBuzz"def test_none_lanza_typeerror(): with pytest.raises(TypeError): fizzbuzz(None)def test_tipo_incorrecto_lanza_typeerror(): with pytest.raises(TypeError): fizzbuzz("3")
pytest -q
Variantes para subir de nivel (opcional)
- FizzBuzz en rango: devolver lista de resultados de 1 a
n - Parámetros configurables: cambiar divisores y palabras
- Implementación funcional: separar validación y lógica
- Versión CLI: imprimir resultados en consola
Lo que aprendiste
- Importancia del orden en condicionales
- Cómo escribir funciones puras y testeables
- Validación estricta de entradas
- Cómo convertir un ejercicio clásico en código limpio
Accede al código completo y a los tests en GitHub para ejecutar y modificar la solución localmente.
Sigue con Reto #9 — Contar vocales en una cadena para reforzar strings, bucles y condiciones simples.