Python でキーワード引数を使用する

完了

省略可能な引数には既定値が割り当てられている必要があります。 これらの名前付き引数は、"キーワード引数" と呼ばれます。 キーワード引数の値は、関数自体で定義する必要があります。 キーワード引数を使用して定義されている関数を呼び出している場合、キーワード引数を使用する必要はまったくありません。

アポロ 11 号のミッションでは、月に到着するのに約 51 時間かかりました。 アポロ 11 号のミッションと同じ値を既定値として使用して、到着の推定時間を返す関数を作成しましょう。

from datetime import timedelta, datetime

def arrival_time(hours=51):
    now = datetime.now()
    arrival = now + timedelta(hours=hours)
    return arrival.strftime("Arrival: %A %H:%M")

この関数では、datetime モジュールを使用して現在の時刻を定義します。 次に、timedelta を使用して、新しい時間オブジェクトが生成される加算操作を可能にします。 その結果を計算した後、文字列として書式指定された推定値 arrival を返します。 これを引数なしで呼び出してみてください。

arrival_time()
Arrival: Saturday 16:42

関数でキーワード引数が定義されているにもかかわらず、関数の呼び出し時にその引数を渡さないことが許可されます。 この場合、hours 変数の既定値は 51 です。 現在の日付が正しいことを確認するには、hours の値として 0 を使用します。

arrival_time(hours=0)
Arrival: Thursday 13:42

引数とキーワード引数の組み合わせ

場合によっては、関数に引数とキーワード引数の組み合わせが必要になることがあります。 Python では、この組み合わせは特定の順序に従います。 常に引数が最初に、その後にキーワード引数が宣言されます。

arrival_time() 関数を更新して、宛先の名前である必須の引数を受け取るようにします。

from datetime import timedelta, datetime

def arrival_time(destination, hours=51):
    now = datetime.now()
    arrival = now + timedelta(hours=hours)
    return arrival.strftime(f"{destination} Arrival: %A %H:%M")

必須の引数を追加したため、この関数を引数なしで呼び出すことはできなくなりました。

arrival_time()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: arrival_time() missing 1 required positional argument: 'destination'

このエラーを回避するために、destination の値として "Moon" を使用します。

arrival_time("Moon")
Moon Arrival: Saturday 16:54

3 つ以上の値を渡すこともできますが、それらをコンマで区切る必要があります。 軌道に到達するのに約 8 分 (0.13 時間) かかるため、それを引数として使用します。

arrival_time("Orbit", hours=0.13)
Orbit Arrival: Thursday 14:11