Подтвердить что ты не робот

Как определить, является ли год високосным годом?

Я пытаюсь сделать простой калькулятор, чтобы определить, является ли определенный год високосным годом.

По определению, високосный год делится на четыре, но не на сто, если он не делится на четыреста.

Вот мой код:

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.

4b9b3361

Ответ 1

import calendar
print calendar.isleap(1900)

Python предоставляет эту функцию уже в календаре библиотечного модуля.

Ответ 2

Как однострочный:

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 имеет ту же реализацию.

Ответ 3

Вы тестируете три разных вещи на 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)

Ответ 4

Вся формула может содержаться в одном выражении:

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"

Ответ 5

Ваша функция ничего не возвращает, поэтому, когда вы используете ее с инструкцией 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() и без оператора печати и возвращается вызывающему, который затем печатает его по очереди.

Ответ 6

Високосный год точно делится на 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))

Ответ 7

Если вы не хотите import calendar и применять метод .isleap вы можете попробовать следующее:

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

Ответ 8

@Мохаммед Эльзанати - что если мы удалим if ((year% 100) == 0) и другие операторы else? мы получаем тот же ответ. Зачем нам это если выражение? Извините, у меня недостаточно репутации, поэтому я не могу комментировать