[解決!Python]うるう年かどうかを判定するには:解決!Python
ある年がうるう年かどうかを判定するには、calendarモジュールが提供するisleap関数を使うのが簡単だ。また、同じ動作をする関数のコードも紹介する。
from calendar import isleap
year_list = [2000, 2019, 2020, 2021, 2100]
for year in year_list:
result = isleap(year)
print(f'{year} is a leap year: {result}')
# 出力結果:
#2000 is a leap year: True
#2019 is a leap year: False
#2020 is a leap year: True
#2021 is a leap year: False
#2100 is a leap year: False
def isleapyear(year):
return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
for year in year_list:
result = isleapyear(year)
print(f'{year} is a leap year: {result}')
# 出力結果は上に同じ
# datetimeオブジェクト、time.struct_timeオブジェクトを対象に判定する
from datetime import datetime
import time
dt = datetime.now()
result = isleap(dt.year)
print(f'{dt.year} is a leap year: {result}') # 2021 is a leap year: False
d = time.localtime()
result = isleap(d.tm_year)
print(f'{d.tm_year} is a leap year: {result}') # 2021 is a leap year: False
years_datetime_type = [datetime(year=y, month=1, day=1) for y in year_list]
for d in years_datetime_type:
result = isleap(d.year)
print(f'{d.year} is a leap year: {result}')
years_str_time = [datetime.timetuple(y) for y in years_datetime_type]
for d in years_str_time:
result = isleap(d.tm_year)
print(f'{d.tm_year} is a leap year: {result}')
うるう年かどうかの判定
うるう年かどうかは以下のような条件を基に判定される。
- その年が4で割り切れるなら、基本的にその年はうるう年
- ただし、その年が100で割り切れるときには、その年はうるう年ではない
- ただし、その年が400で割り切れるときには、その年はうるう年
この条件は、Pythonに標準で添付のcalendarモジュールが提供するisleap関数を使うことで簡単に判定できる。
以下に例を示す。
from calendar import isleap
year_list = [2000, 2019, 2020, 2021, 2100]
for year in year_list:
result = isleap(year)
print(f'{year} is a leap year: {result}')
# 出力結果:
#2000 is a leap year: True
#2019 is a leap year: False
#2020 is a leap year: True
#2021 is a leap year: False
#2100 is a leap year: False
この例では、isleap関数に2000、2019、2020、2021、2100を渡している。これらの年がうるう年かどうかは上記の条件に照らし合わせると以下のようになる。
- 2000:4で割り切れ、100で割り切れるが、400で割り切れるのでうるう年
- 2019:4で割り切れないのでうるう年ではない(平年)
- 2020:4で割り切れ、100で割り切れないのでうるう年
- 2021:4で割り切れないのでうるう年ではない
- 2100:4で割り切れ、100で割り切れ、400で割り切れないのでうるう年ではない
実際の出力結果もそのようになっていることに注目されたい。
また、この判定を行う関数は自分で次のように定義することもできる(実際、calendarモジュールのソースコードでも以下と同じロジックでisleap関数が実装されている)。
def isleapyear(year):
return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
for year in year_list:
result = isleapyear(year)
print(f'{year} is a leap year: {result}')
# 出力結果は上に同じ
datetimeオブジェクト、time.struct_timeオブジェクトを対象に判定する
Copyright© Digital Advantage Corp. All Rights Reserved.