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

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

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

使用教材・機材

 現時点の学習のための使用教材・機材は以下の通り。

・2015年製『MacBookPro』メモリ8GB・intelCPU

・『やさしいPython』初版(2018年)

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

import datetime
import time
import sys

# 現在時刻を取得する
def current_time_obj():
    return datetime.datetime.now()

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

# 終了までの残り時間を分単位で取得する
def get_remaining_time(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 = [
        ("9:30", "10:15"),
        ("10:25", "11:10"),
        ("11:20", "12:05"),
        ("12:55", "13:40"),
        ("13:50", "14:35"),
        ("14:45", "15:30"),
    ]
    # 下校時刻
    end_time = "15:30"
    end_time_obj = datetime.datetime.strptime(end_time, "%H:%M")

    while True:
        if current_time_obj().hour >= end_time_obj.hour and current_time_obj().minute >= end_time_obj.minute:
            print("下校時間です!お疲れさまでした。(スクリプトを終了します)")
            # スクリプトを終了
            sys.exit()
            break

        current_time_strftime = current_time_obj().strftime("%H:%M")
        period = get_current_period(timetable, current_time_strftime)

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

        # 下校までの残り時間
        now = current_time_obj()
        remaining_to_end = end_time_obj - now
        print(f"下校まであと{remaining_to_end.seconds // 60}分です。")

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

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

実行イメージ

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

感想

  • メソッドにreturnを入れないと返り値がNoneになる。rubyではreturnを書くときは「あえてそれを返してます」みたいな意味を含めていたので違和感を感じる。endみたいなもんだと思っておけばいいか。
  • あとNoneってなんやねん。。nilのこと?調べておく。
  • rubyで言うところの配列、ハッシュがpythonだとリスト、辞書と呼ぶようで慣れない。。あと.freezeされた配列はタプルっていうらしい。
  • enumerate関数の使いどころがわかんないけど、リストをループさせるときにenumerateオブジェクトにしておくとindex番号も出力できるよ!みたいなノリの理解をした。
  • pythonのmapやsortのメソッドはrubyと似た挙動だが、ブロック処理ができないので、やりたかったらいちいちlambdaで無名関数を作って添える感じになるっぽい。