La tareade va a ser: escribir y probar una función que tome dos argumentos (un año y un mes) y devuelva el número de días para el par mes/año dado (aunque solo febrero es sensible al valor del año, la función debería ser universal).
Función is_year_leap
Primero, definimos una función llamada is_year_leap que toma un argumento year:

Esta función determina si un año es bisiesto. Un año es bisiesto si:
Es divisible por 4.
No es divisible por 100, a menos que también sea divisible por 400.
Función days_in_month
A continuación, definimos la función days_in_month que toma dos argumentos: year y month:

Esta función debe devolver el número de días en un mes dado de un año específico. El único mes cuyo número de días varía dependiendo del año es febrero, debido a los años bisiestos.
Código de Prueba
Se crea una lista de años y meses para probar la función days_in_month:

test_years: años que se van a probar.
test_months: meses correspondientes a los años en test_years.
test_results: resultados esperados para los pares año/mes dados.
Luego, se usa un bucle for para recorrer las listas y probar la función:

Para cada iteración:
Se obtiene el año (yr) y el mes (mo) de las listas.
Se llama a la función days_in_month con yr y mo.
Se compara el resultado de la función con el resultado esperado (test_results[i]).
Se imprime «OK» si el resultado es correcto o «Failed» si no lo es.
Implementación Sugerida para days_in_month
Aquí se presenta una posible implementación de days_in_month:

Código de prueba

Explicación de la Implementación
- La función is_year_leap comprueba si el año es bisiesto. Esta función está explicada en detalle en el artículo REVIT ARCHITECTURE (929) – PYTHON – Funciones (13) – Devolver el resultado de una función (5) Ejemplo de función con argumento.
- La función days_in_month primero verifica si el mes es válido (1-12) y si el año es válido (mayor que 0). Si no lo son, devuelve None. Esta línea de código define la función days_in_month que toma dos parámetros: year: el año como un número entero, y month: el mes como un número entero.
Validación del Mes:

Esta sección del código comprueba si el valor del mes es válido. En el calendario gregoriano (el más comúnmente utilizado), los meses van del 1 al 12. Por lo tanto, esta condición verifica si el valor de month está fuera de este rango:
month < 1: verifica si el mes es menor que 1.
month > 12: verifica si el mes es mayor que 12.
Si cualquiera de estas condiciones es verdadera, el mes no es válido y la función devuelve None.
Validación del Año

Esta parte del código verifica si el valor del año es válido. Aunque el calendario gregoriano se usa para fechas a partir del año 1582, esta validación simplemente comprueba que el año es mayor que 0.
- year < 1: verifica si el año es menor que 1.
Si esta condición es verdadera, el año no es válido y la función devuelve None.
Resumen
Estas validaciones iniciales aseguran que los argumentos proporcionados a la función days_in_month son razonables antes de proceder con cualquier cálculo adicional. Si alguno de los argumentos no es válido, la función devuelve None, lo que indica que los datos de entrada no tienen sentido y, por lo tanto, no se puede determinar el número de días del mes.
- Usa una lista days que contiene los días de cada mes.

- Para febrero, verifica si el año es bisiesto usando is_year_leap. Esta sección de la función days_in_month maneja la lógica para determinar el número de días en un mes específico de un año determinado. La función previamente ha validado que los valores de year y month son válidos.
Lógica para Febrero

Esta línea comprueba si el mes es febrero (mes 2). Febrero es especial porque su número de días varía dependiendo de si el año es bisiesto o no.
Determinación de Año Bisiesto

Si el mes es febrero, la función necesita determinar si el año es bisiesto para decidir si febrero tiene 28 o 29 días.
is_year_leap(year): llama a la función is_year_leap que determina si el año es bisiesto.
Si is_year_leap(year) devuelve True, el año es bisiesto, y febrero tiene 29 días, por lo que la función devuelve 29.
Si is_year_leap(year) devuelve False, el año no es bisiesto, y febrero tiene 28 días, por lo que la función devuelve 28.
Lógica para Otros Meses

Si el mes no es febrero, la función utiliza una lista llamada days que contiene el número de días de cada mes del año, con los índices de la lista correspondiendo a los meses (enero es el índice 0, febrero es el índice 1, etc.).
days[month – 1]: accede al número de días correspondiente al mes dado. Se usa month – 1 porque las listas en Python están indexadas desde 0, mientras que los meses están numerados desde 1.
Por ejemplo, si el month es 3 (marzo), days[month – 1] se convierte en days[2], que devuelve el número de días en marzo.
Finalmente la comprobación:

Explicación de las Listas de Prueba
test_years: Lista de años a probar.
test_months: Lista de meses correspondientes a los años en test_years.
test_results: Lista de resultados esperados para cada par año/mes.
Ejecución del Bucle de Prueba
Para cada índice en el rango de test_years:
- Se obtiene el año (yr) y el mes (mo) de las listas.
- Se llama a la función days_in_month con yr y mo.
Se compara el resultado de la función con el resultado esperado (test_results[i]).
Se imprime «OK» si el resultado es correcto o «Failed» si no lo es.
Resultados Esperados
1900, febrero: 28 días (año no bisiesto)
2000, febrero: 29 días (año bisiesto)
2016, enero: 31 días
1987, noviembre: 30 días
2023, mes 13: None (mes inválido)
2024, febrero: 29 días (año bisiesto)
Año -1: None (año inválido)
2022, mes 0: None (mes inválido)
Ejecución del Código
Se ejecuta el código y verificar los resultados:

Confirmación de los Resultados
Cada par año/mes debe producir la salida esperada según se describe en los resultados esperados. El código de prueba está diseñado para cubrir varios casos, incluyendo años bisiestos, meses válidos, y entradas inválidas para garantizar que la función days_in_month maneja correctamente todos los casos posibles.
Contenido Web de Yolanda Muriel está sujeto bajo Licencia Creative Commons Atribución-NoComercial-SinDerivadas 3.0 Unported.
