Ответ 1
import calendar
print calendar.isleap(1900)
Python предоставляет эту функцию уже в календаре библиотечного модуля.
Я пытаюсь сделать простой калькулятор, чтобы определить, является ли определенный год високосным годом.
По определению, високосный год делится на четыре, но не на сто, если он не делится на четыреста.
Вот мой код:
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)
Когда я пытаюсь выполнить это внутри Python IDLE, модуль возвращает None
. Я уверен, что я должен получить 1900 is a leap year
.
import calendar
print calendar.isleap(1900)
Python предоставляет эту функцию уже в календаре библиотечного модуля.
Как однострочный:
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)
Он похож на ответ Mark , но короткие замыкания при первом тесте (обратите внимание на скобки).
Как заметил в комментариях П. Ортис, стандартная библиотека calendar.isleap
имеет ту же реализацию.
Вы тестируете три разных вещи на n:
n % 4
n % 100
n % 400
В течение 1900:
1900 % 4 == 0
1900 % 100 == 0
1900 % 400 == 300
Итак, 1900 не вводит предложение if
, потому что 1900 % 100 != 0
есть False
Но 1900 также не входит в предложение else
, потому что 1900 % 4 != 0
также False
Это означает, что выполнение достигает конца вашей функции и не видит оператора return, поэтому возвращает None
.
Это переписывание вашей функции должно работать и должно возвращать False
или True
в соответствии с номером года, который вы передаете в него. (Обратите внимание, что, как и в другом ответе, вам нужно что-то вернуть, а не распечатать его.)
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)
(Алгоритм из Wikipedia)
Вся формула может содержаться в одном выражении:
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"
Ваша функция ничего не возвращает, поэтому, когда вы используете ее с инструкцией print
, вы получаете None
. Поэтому просто вызовите свою функцию следующим образом:
leapyr(1900)
или измените свою функцию, чтобы вернуть значение (с помощью оператора return
), который затем будет напечатан оператором print
.
Примечание. Это не касается каких-либо возможных проблем с вашим вычислением в течение високосного года, но ОТВЕТЕТ ВАШЕГО СПЕЦИФИЧЕСКОГО ВОПРОСА о том, почему вы получаете None
в результате вызова функции в сочетании с помощью print
.
Пояснение:
Несколько коротких примеров, касающихся вышеперечисленного:
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
Теперь, когда я их назову:
print add2(10, 5)
это дает:
the result is: 15
None
Первая строка приходит из инструкции print
внутри add2()
. None
из оператора печати, когда я вызываю функцию add2()
, которая имеет не, имеет оператор return, вызывая печать None
. Кстати, если бы я только что вызвал функцию add2()
просто с помощью (note, no print
):
add2()
Я бы просто получил вывод инструкции print the result is: 15
без None
(похоже, что вы пытаетесь сделать).
Сравните это с:
print add2_New(10, 5)
который дает:
15
В этом случае результат вычисляется в функции add2_New()
и без оператора печати и возвращается вызывающему, который затем печатает его по очереди.
Високосный год точно делится на 4, за исключением столетних лет (годы, заканчивающиеся на 00). Год столетия - високосный год, только если он отлично делится на 400. Например,
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
и применять метод .isleap
вы можете попробовать следующее:
def isleapyear(year):
if year % 4 == 0 and (year % 100 != 0 or year % 400 == 0):
return True
return False
@Мохаммед Эльзанати - что если мы удалим if ((year% 100) == 0) и другие операторы else? мы получаем тот же ответ. Зачем нам это если выражение? Извините, у меня недостаточно репутации, поэтому я не могу комментировать