Pythonでうるう年の判定方法は? 関数や実装例

Pythonのうるう年判定

Pythonのうるう年判定

Pythonのcalenderモジュールにうるう年判定が組み込まれているので、これを使うのが一番簡単。

Pythonのうるう年判定のサンプルコード

うるう年判定のPythonサンプル

$ cat urucalender.py
#!/usr/bin/python3

import calendar

# 2022年から2030まで、閏年を判定表示
for i in range(2022,2030):
if( calendar.isleap(i) ):
print( i,"年はうるう年です" )

# 包括表記で、うるう年を2050年まで列挙

uru_list=[i for i in range(2022,2050) if calendar.isleap(i)]
print( "うるう年の列挙リスト",uru_list )

2022年~2030年までのうるう年を表示して、さらに2022年~2050年までのうるう年の列挙リストを表示しています。

実行するとこうなります。

2024 年はうるう年です
2028 年はうるう年です
うるう年の列挙リスト [2024, 2028, 2032, 2036, 2040, 2044, 2048]

4で割り切れる年をif判定する

ifでうるう年判定

プログラミングの学習サンプルでよく見かけるのが、年数を4で割り切れたら、うるう年と判定するというもの。

$ cat uruif.py
#!/usr/bin/python3

# 2022年から2030まで、閏年を判定表示
for i in range(2022,2030):
if( i % 4 == 0 ):
print( i,"年はうるう年です" )

%はあまりを求める演算子です。

関連 Pythonのあまり

実行するとこうなります。

$ ./uruif.py
2024 年はうるう年です
2028 年はうるう年です

悪くはないのですが、開発現場では「うるう年判定が正常に動くかどうか」という余分なテストをするはめになるので、calenderモジュールを利用するほうが現実的だと思います。

うるう年列挙で判定する

うるう年を列挙

構造的にはスマートではないですが、閏年を列挙して判定する方法もアリといえばアリ?今後せいぜい10年くらいしか使わないだろう…というプログラムなら使っても問題なさそう。

$ cat ururekkyo.py
#!/usr/bin/python3

# 閏年を列挙
uruu_list=[2020,2024,2028,2032,2036,2040,2044,2048,2052]

# 2022年から2030まで、閏年を判定表示
for i in range(2022,2030):
if( i in uruu_list ):
print( i,"年はうるう年です" )

実行するとこうなります。

$ ./ururekkyo.py
2024 年はうるう年です
2028 年はうるう年です

しかし、この手の手抜きが、かつて2000年問題を引き起こしたのを考えると、この方法はやめた方が良いのかも。

開発現場では、「動作しているソースコードをコピペして効率を上げる」(というか、ラクする)という行為が日常的に行われているので、遠い未来の開発者に迷惑をかける可能性があるんですね。COBOL全盛期時代にもよくおこなわれていました。

関連 COBOLの将来性と需要

少なくとも、開発現場でこんなコードが書かれていたらチェックが入りそうですね。

Pythonのうるう年まとめ

Pythonのうるう年まとめ

  • Pythondeうるう年判定するならcalendarモジュール使用が無難
  • if文で4で割ってあまりなしの年をうるう年判定してもよいが、その部分のテストが必要になる
  • うるう年を列挙してテーブル化して判定すると、ソースコードのコピペで何十年も先に影響あるかも