2025年1月10日:Pythonで作った学習タイマーのコードを改良した

転職のためにPythonでAIとIoTを学ぶ

 2025年の1~6月いっぱいまでの期間でPythonを使ってAIとIoTの知識を学び、転職のためのポートフォリオを作ることになった。学んだ記録をつけて、学習を振り返るために記録を残す。

2025年1月10日:Pythonで学習タイマーを作ってみた

import datetime
import time
import sys

# 現在の時限を取得する(文字列で比較する)
def get_current_period(timetable, current_time):
    for i, (start, end) in enumerate(timetable, 1):
        if start <= current_time <= end:
            return i
    return "休憩中"

# 終了までの残り時間を分単位で取得する(datetimeオブジェクトで計算する)
def get_remaining_minutes(start, end):
    start_time = datetime.datetime.strptime(start, "%H:%M")
    end_time = datetime.datetime.strptime(end, "%H:%M")
    remaining_time = end_time - start_time
    return remaining_time.seconds // 60

def main():
    timetable = [
        ("09:30", "10:15"),
        ("10:25", "11:10"),
        ("11:20", "12:05"),
        ("12:55", "13:40"),
        ("13:50", "14:35"),
        ("14:45", "15:30"),
    ]
    # 下校時刻だけを文字列で設定していてdatetimeオブジェクトで比較できないので冗長を許容
    end_time = datetime.datetime.strptime("15:30", "%H:%M").strftime("%H:%M")

    while True:
        current_time = datetime.datetime.now().strftime("%H:%M")
        if current_time >= end_time:
            print("下校時間です!お疲れさまでした。(スクリプトを終了します)")
            # スクリプトを終了
            sys.exit()
            break

        period = get_current_period(timetable, current_time)

        if period != "休憩中":
            start, end = timetable[period - 1]
            remaining = get_remaining_minutes(current_time, end)
            print(f"現在{period}時限目です。授業はあと{remaining}分で終わります。")
        else:
            print("休憩中です")

        # 下校までの残り時間
        remaining_to_end = get_remaining_minutes(current_time, end_time)
        print(f"下校まであと{remaining_to_end}分です。")

        # 5分間隔で実行すための待機
        time.sleep(300)

# Pythonのスクリプトが直接実行された場合にのみ実行する
if __name__ == "__main__":
    main()

実行イメージ(変わらないけども)

PS C:\Users\hoge> python study_timer.py
現在5時限目です。授業はあと29分で終わります。
下校まであと83分です。
現在5時限目です。授業はあと24分で終わります。
下校まであと78分です。

感想

  • 時間割を手打ちしたかったので雑に定義したら、9時台がうまく動かなかった。。原因は以下。
>>> "9:00" >= "09:10" 
True
>>> "09:00" >= "09:10"
False
  • 現在時刻を2回取得していて、授業と下校の残り時間に差ができていたので取得を1回にする
  • メソッドの名前をわかりやすくする
  • DRYじゃない部分を修正
  • いかんともしがたい冗長部分にコメントでいいわけしておく