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''.