60

特定の年がうるう年かどうかを判断する簡単な計算機を作成しようとしています。

定義上、うるう年は 4 で割り切れますが、400 で割り切れない限り、100 で割り切れません。

これが私のコードです:

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

4

12 に答える 12

184

使用calendar.isleap:

import calendar
print(calendar.isleap(1900))
于 2012-07-24T00:40:47.063 に答える
60

ワンライナー関数として:

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)

マークの回答に似ていますが、最初のテストで短絡します(括弧に注意してください)。

calendar.isleapまたは、まったく同じ実装を持つ標準ライブラリの を使用できます。

from calendar import isleap
print(isleap(1900))  # False
于 2015-06-08T16:10:51.847 に答える
19

nで3つの異なることをテストします。

n % 4
n % 100
n % 400

1900年の場合:

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

したがって、1900はif句に入力されません。1900 % 100 != 0False

しかし、1900年もelse条項に含まれていません。1900 % 4 != 0False

これは、実行が関数の最後に到達し、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
    return False
print leapyr(1900)

(ウィキペディアのアルゴリズム)

于 2012-07-23T23:05:32.740 に答える
11

式全体を 1 つの式に含めることができます。

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"
于 2012-07-24T00:31:51.220 に答える
4

あなたの関数は何も返さないので、printステートメントで使用すると get 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ステートメントから来ています。return ステートメントを持たない関数を呼び出すと、print ステートメントからが出力されます。ちなみに、 関数を単純に (note, no statement) で呼び出した場合:add2()Noneadd2()Noneadd2() print

add2()

(あなたがやろうとしているように見えます)the result is: 15なしで、printステートメントの出力を取得しただけです。None

これを次のものと比較してください。

print add2_New(10, 5)

与える:

15

この場合、結果は関数内で計算され、add2_New()print ステートメントはなく、呼び出し元に返され、呼び出し元はそれを出力します。

于 2012-07-23T23:01:28.327 に答える
2

閏年は、世紀年 (00 で終わる年) を除いて、4 で割り切れます。世紀年は、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))
于 2017-02-16T12:03:14.940 に答える
-1

1700 年から 1917 年まで、公式の暦はユリウス暦でした。それ以来、彼らはグレゴリオ暦システムを使用しています。ユリウス暦からグレゴリオ暦への移行は 1918 年に発生し、1 月 31 日の翌日が 2 月 14 日でした。これは、1918 年の 32 日が 2 月 14 日であることを意味します。

どちらの暦体系でも、2 月は日数が変化する唯一の月であり、うるう年は 29 日、その他の年は 28 日です。ユリウス暦ではうるう年は 4 で割り切れますが、グレゴリオ暦ではうるう年は次のいずれかです。

400で割り切れます。

4 で割り切れるが、100 で割り切れない。

したがって、うるう年のプログラムは次のようになります。

def leap_notleap(year):

    yr = ''
    if year <= 1917:
        if year % 4 == 0:
            yr = 'leap'
        else:
            yr = 'not leap'
    elif year >= 1919:
        if (year % 400 == 0) or (year % 4 == 0 and year % 100 != 0):
            yr = 'leap'
        else:
            yr = 'not leap'
    else:
        yr = 'none actually, since feb had only 14 days'

    return yr
于 2019-11-29T04:24:43.847 に答える