saber raptor pseudocodigo como calculadora bisiestos bisiesto años año algoritmo python python-2.7

python - pseudocodigo - como saber si un año es bisiesto raptor



¿Cómo determinar si un año es bisiesto? (7)

Estoy tratando de hacer una calculadora simple para determinar si un año determinado es un año bisiesto o no.

Por definición, un año bisiesto es divisible por cuatro, pero no por cien, a menos que sea divisible por cuatrocientos.

Aquí está mi código:

def leapyr(n): if n%4==0 and n%100!=0: if n%400==0: print n, " is a leap year." elif n%4!=0: print n, " is not a leap year." print leapyr(1900)

Cuando pruebo esto dentro de Python IDLE, el módulo devuelve None . Estoy bastante seguro de que debería obtener 1900 is a leap year .


Como un trazador de líneas:

def is_leap_year(year): """Determine whether a year is a leap year.""" return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)

Es similar a la answer de Marcos, pero cortocircuitos en la primera prueba (fíjese en el paréntesis).

Como observó P. Ortiz en los comentarios, la función calendar.isleap la biblioteca estándar tiene la misma implementación.


La fórmula completa puede estar contenida en una sola expresión:

def is_leap_year(year): return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0 print n, " is a leap year" if is_leap_year(n) else " is not a leap year"


Probas tres cosas diferentes en n:

n % 4 n % 100 n % 400

Para 1900:

1900 % 4 == 0 1900 % 100 == 0 1900 % 400 == 300

Entonces 1900 no ingresa la cláusula if porque 1900 % 100 != 0 es False

Pero 1900 tampoco ingresa a la cláusula else porque 1900 % 4 != 0 también es False

Esto significa que la ejecución llega al final de su función y no ve una declaración de devolución, por lo que devuelve None .

Esta reescritura de su función debería funcionar, y debería devolver False o True según corresponda para el número de año que ingrese. (Tenga en cuenta que, como en la otra respuesta, debe devolver algo en lugar de imprimirlo).

def leapyr(n): if n % 400 == 0: return True if n % 100 == 0: return False if n % 4 == 0: return True else: return False print leapyr(1900)

(Algoritmo de Wikipedia )


Si no quieres import calendar y aplicar el método .isleap puedes probar esto:

def isleapyear(year): if year % 4 == 0 and (year % 100 != 0 or year % 400 == 0): return True return False


Su función no devuelve nada, por eso, cuando la usa con la declaración de print , obtiene None . Entonces, simplemente llama a tu función así:

leapyr(1900)

o modifique su función para devolver un valor (utilizando la declaración de return ), que luego sería impresa por su extracto print .

Nota : Esto no resuelve ningún posible problema que tenga con el cálculo de su año bisiesto, pero RESPONDE SU PREGUNTA ESPECÍFICA en cuanto a por qué está recibiendo None como resultado de su llamada de función junto con su print .

Explicación

Algunos ejemplos cortos con respecto a lo anterior:

def add2(n1, n2): print ''the result is:'', n1 + n2 # prints but uses no *return* statement def add2_New(n1, n2): return n1 + n2 # returns the result to caller

Ahora cuando los llamo:

print add2(10, 5)

esto da:

the result is: 15 None

La primera línea proviene de la declaración de print dentro de add2() . El None de la instrucción de impresión cuando llamo a la función add2() que no tiene una declaración de devolución, lo que hace que None se imprima. Por cierto, si acabara de llamar a la función add2() simplemente con (nota, sin declaración de print ):

add2()

Acababa de obtener el resultado de la declaración impresa, the result is: 15 sin la None (que se parece a lo que está tratando de hacer).

Compare esto con:

print add2_New(10, 5)

lo que da:

15

En este caso, el resultado se calcula en la función add2_New() y no en la declaración de impresión, y se devuelve a la persona que llama que luego lo imprime.


Un año bisiesto es exactamente divisible por 4, excepto por siglos (años que terminan en 00). El año del siglo es bisiesto solo si es perfectamente divisible por 400. Por ejemplo,

if( (year % 4) == 0): if ( (year % 100 ) == 0): if ( (year % 400) == 0): print("{0} is a leap year".format(year)) else: print("{0} is not a leap year".format(year)) else: print("{0} is a leap year".format(year)) else: print("{0} is not a leap year".format(year))


import calendar print calendar.isleap(1900)

Python proporciona esta funcionalidad ya en el módulo de la biblioteca ''calendario''.