うるう年の判定法

このページではPythonでうるう年を判定する方法について解説します。

うるう年の判定法

うるう年はその年が4で割り切れるかつ「100で割り切れないもしくは400で割り切れる」年となります。いくつかのif文でできそうなので自力で実装したくなるかもしれませんが、Pythonではこういったよく使われるロジックの多くがすでに標準ライブラリに実装されています。

calendarモジュールのisleap関数を使用するとうるう年の判定結果を真理値で結果を得ることができます。

import calendar
calendar.isleap(2022) # うるう年の場合True

以下のコードでは年を表す変数yの値によりうるう年かどうかを判定して出力しています。

import calendar

y = 2022
if calendar.isleap(y):
    print("うるう年です")
else:
    print("うるう年ではありません")

うるう年の一覧出力

また、rangeと組み合わせてある期間のうるう年を列挙することができます。以下のコードでは西暦0年から2022年までのうるう年を一覧で標準出力に出力しています。リストにしたい場合は内包表記を使用したほうがスマートでしょう。

import calendar

# for文で出力する場合
for y in range(0, 2023):
    if calendar.isleap(y):
        print(y)

# 内包表記でリストを構築
leaps = [y for y in range(0, 2023) if calendar.isleap(y)]

補足1 isleapの実装

if文での実装例が知りたい方がいるかも知れません。そういった方は是非calendarモジュールの実装も参考にしてみてください。実はisleap関数は以下のようにワンライナーで結果を返しています。

def isleap(year):
    """Return True for leap years, False for non-leap years."""
    return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)

calendarモジュールには比較的読みやすい簡単な関数がいくつかあるので初学者の方は一読してみることをおすすめします。なお、モジュールのファイル格納場所は以下で調べることができます。

import calendar
print(calendar.__file__)

補足2 干支と一緒に出力する

干支と合わせて検索されることが多いようなのでもう1つ補足、干支と一緒に出力する方法についても解説します。まず、西暦0年が申年なので以下のタプルのインデックスに12の剰余を指定すると干支が得られます。

earthly_branches = ('申', '酉', '戌', '亥', '子', '丑', '寅', '卯', '辰', '巳', '午', '未', )
print(earthly_branches[2022 % 12]) # 寅

これを利用し、以下のようなコードでうるう年を干支と合わせて一覧出力することができます。

import calendar

# 西暦0年から1周分の干支のタプル
earthly_branches = ('申', '酉', '戌', '亥', '子', '丑', '寅', '卯', '辰', '巳', '午', '未',)

# うるう年と干支
for y in range(0, 2023):
    if calendar.isleap(y):
        print(y, earthly_branches[y % 12])

数学的に自明ですが、上のコードを実行するとうるう年の干支は、子・辰・申のいずれかしかないことが確認できます。