タイムトラベル目的地計算機

PythonPythonBeginner
オンラインで実践に進む

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

このプロジェクトでは、Python を使ってタイムトラベルの目的地を計算する方法を学びます。この計算機は、現在の日付と宇宙船が移動できる推定日数に基づいて、タイムトラベルする宇宙船が到達できる最大の過去と未来の日付を決定するのに役立ちます。

👀 プレビュー

## 入力:

## 出力:

🎯 タスク

このプロジェクトでは、以下のことを学びます。

  • 与えられた文字列から日付情報を抽出する方法
  • 与えられた日数に基づいて過去と未来の日付を計算する方法
  • 計算された日付をフォーマットし、文字列のリストとして返す方法

🏆 成果

このプロジェクトを完了すると、以下のことができるようになります。

  • Python で日付と timedelta を扱う方法を理解する
  • タイムトラベルの目的地を計算する関数を実装する
  • コードで例外とエッジケースを処理する
  • クリーンで保守可能な Python コードを書く

日付情報の抽出

このステップでは、入力された日付文字列から年、月、日を抽出する方法を学びます。

  1. 好きなコードエディタで time_travel_destination.py ファイルを開きます。
  2. time_travel_destination(time: str, days: int) 関数を見つけます。
  3. 関数の中に、time パラメータから年、月、日を抽出するための次のコードを追加します。
try:
    ## 日付文字列をから年、月、日を抽出する
    year, month, day = map(int, time.split("-"))
## except (ValueError, OverflowError):
##     ## ValueError または OverflowError が発生した場合、空のリストを返す
##     return []

この行は、map() 関数と split() メソッドを使って、time 文字列を年、月、日を表す整数のリストに変換します。

  1. 次に、抽出された日付が有効かどうかを確認する必要があります。これを行うには、datetime.date() 関数を使うことができます。
## 日付文字列をから年、月、日を抽出する
year, month, day = map(int, time.split("-"))
## 日付が有効かどうかを確認する
datetime.date(year, month, day)

日付が有効な場合、この行は例外を発生させません。日付が無効な場合、ValueError が発生します。

過去と未来の日付を計算する

このステップでは、与えられた日数に基づいて過去と未来の日付を計算する方法を学びます。

  1. time_travel_destination(time: str, days: int) 関数の中に、過去と未来の日付を計算するための次のコードを追加します。
try:
    past_time = datetime.date(year, month, day) - datetime.timedelta(days=days)
except OverflowError:
    past_time = datetime.date(1, 1, 1)
future_time = datetime.date(year, month, day) + datetime.timedelta(days=days)

past_time 変数は、元の日付から days パラメータを引くことで計算されます。ただし、結果の日付が最小の表現可能な日付(西暦 1 年 1 月 1 日)より前の場合、OverflowError が発生します。この場合、past_time を最小の表現可能な日付に設定します。

future_time 変数は、元の日付に days パラメータを加えることで計算されます。

結果をフォーマットして返す

このステップでは、過去と未来の日付をフォーマットし、文字列のリストとして返す方法を学びます。

  1. time_travel_destination(time: str, days: int) 関数の中に、過去と未来の日付をフォーマットし、リストとして返すための次のコードを追加します。
return [past_time.strftime("%d-%m-%Y"), future_time.strftime("%d-%m-%Y")]

strftime() メソッドは、past_timefuture_timedatetime.date オブジェクトを "dd-mm-yyyy" 形式の文字列にフォーマットするために使用されます。

  1. 最後に、関数の実行中に発生する可能性のある ValueError または OverflowError 例外をキャッチするための例外処理ブロックを追加します。
except (ValueError, OverflowError):
    return []

これらの例外のいずれかが発生した場合、関数は空のリストを返します。

最終的な time_travel_destination(time: str, days: int) 関数は次のようになります。

import datetime

def time_travel_destination(time: str, days: int):
    try:
        ## 日付文字列をから年、月、日を抽出する
        year, month, day = map(int, time.split("-"))
        ## 日付が有効かどうかを確認する
        datetime.date(year, month, day)
        try:
            ## 与えられた日付から指定された日数を引く
            past_time = datetime.date(year, month, day) - datetime.timedelta(days=days)
        except OverflowError:
            ## OverflowError が発生した場合、past_time を最小の表現可能な日付に設定する
            past_time = datetime.date(1, 1, 1)
        ## 与えられた日付に指定された日数を加える
        future_time = datetime.date(year, month, day) + datetime.timedelta(days=days)
        ## 'dd-mm-yyyy' 形式で過去と未来の日付を返す
        return [past_time.strftime("%d-%m-%Y"), future_time.strftime("%d-%m-%Y")]
    except (ValueError, OverflowError):
        ## ValueError または OverflowError が発生した場合、空のリストを返す
        return []

これで、time_travel_destination(time: str, days: int) 関数の実装が完了しました。time_travel_destination.py ファイルのメインブロックで提供されている例を実行することで、関数をテストできます。以下にいくつかの例を示します。

  • 入力:
print(time_travel_destination('2238-2-11', 30))
print(time_travel_destination('2238-2-11', 0))
print(time_travel_destination('2238-2-11', 100))
  • 出力:
['12-01-2238', '13-03-2238']
['11-02-2238', '11-02-2238']
['03-11-2237', '22-05-2238']
✨ 解答を確認して練習

まとめ

おめでとうございます!このプロジェクトを完了しました。実力を向上させるために、LabEx でさらに多くの実験を行って練習してください。