Pythonで指定した月の日数を求める方法(うるう年対応)
はじめに
ある年 Y と月 M が与えられたとき、その年・月に含まれる日数を返すプログラムを考えてみましょう。たとえば Y = 1992、M = 7 の場合は 31 日、Y = 2020、M = 2 の場合は 2020 年がうるう年であるため 29 日となります。
解き方の手順
この問題は、次のステップで解決できます。
- 月が 2 月(m = 2)の場合:
- その年がうるう年であれば 29 を返し、そうでなければ 28 を返す
- [1, 3, 5, 7, 8, 10, 12] という要素を持つ配列(31 日ある月のリスト)を作成する
- m がこのリストに含まれていれば 31 を返し、それ以外の場合は 30 を返す
うるう年の判定ルール
うるう年かどうかの判定は、以下の規則に従います。
- 400 で割り切れる年 → うるう年
- 100 で割り切れ、かつ 400 では割り切れない年 → 平年
- 4 で割り切れる年 → うるう年
実装例(Python)
それでは、実際のコードを見てみましょう。
class Solution(object):
def numberOfDays(self, y, m):
leap = 0
if y % 400 == 0:
leap = 1
elif y % 100 == 0:
leap = 0
elif y % 4 == 0:
leap = 1
if m == 2:
return 28 + leap
month_list = [1, 3, 5, 7, 8, 10, 12]
if m in month_list:
return 31
return 30
ob1 = Solution()
print(ob1.numberOfDays(2020, 2))入力
2020 2
出力
29
より簡単な方法:calendar モジュールの活用
Python の標準ライブラリには calendar モジュールが用意されており、monthrange() 関数を使えば、うるう年の判定を自分で実装する必要はありません。
import calendar
def numberOfDays(y, m):
return calendar.monthrange(y, m)[1]
print(numberOfDays(2020, 2)) # 出力: 29
print(numberOfDays(1992, 7)) # 出力: 31monthrange(year, month) は「その月の最初の日の曜日」と「その月の日数」をタプルで返します。インデックス [1] を指定することで日数だけを取り出せます。実務ではこちらの方法がシンプルで推奨されます。
まとめ
月の日数を求める際のポイントは、2 月とうるう年の判定です。自前でロジックを実装する場合は、400 年・100 年・4 年の割り算ルールを正しく理解しておくことが重要です。また、標準ライブラリの calendar.monthrange() を使えば、より簡潔かつ安全に実装できます。
-
Pythonで階乗を計算する3つの方法|forループ・再帰・math.factorial()の使い方
階乗(factorial)の計算は、データ分析をはじめとする数学的な処理において、Pythonでよく求められる操作の一つです。階乗とは、正の整数 n に対して、1から n までのすべての整数を掛け合わせた値のことです(例:5! = 1 × 2 × 3 × 4 × 5 = 120)。この記事では、Pythonで階乗を求める3つの方法を、コード例と実行結果とともにわかりやすく解説します。方法1:forループを使うforループで1から目的の数値まで順番に処理し、各ステップで掛け算を繰り返していく方法です。以下のプログラムでは、ユーザーに数値の入力を促し、ループ処理の前にint()で入力値を整数に変換
-
PythonのEnum(列挙型)とは?基本から応用まで徹底解説
PythonのEnumは、一意かつ不変の値に紐付けられたシンボリックな名前(メンバー)の集合、すなわち「列挙型」を作成するためのクラスです。列挙型のメンバー同士はシンボル名によって比較でき、列挙型そのものも反復処理(イテレーション)が可能です。Enumには主に以下のような特徴があります。オブジェクトの評価可能な文字列表現(repr())を持つnameキーワードを使ってメンバー名を表示できるtype()関数でEnumの型を確認できる基本的な使い方の例import enum # enumクラスを使って列挙型を定義 class Days(enum.Enum): Sun = 1 Mon