Python で可変個引数を使用する

完了

Python では、任意の数の引数やキーワード引数を、各引数を宣言することなく使用できます。 この機能は、関数で不明な数の入力を受け取る可能性がある場合に役立ちます。

可変個引数

関数には引数が必須です。 ただし、可変個引数を使用している場合は、関数に任意の数 (0 を含む) の引数を渡すことができます。 可変個引数を使用するための構文では、引数の名前の前に 1 つのアスタリスク (*) を付けます。

次の関数では、受け取った引数を出力します。

def variable_length(*args):
    print(args)

注意

可変個引数に args という名前を付ける必要はありません。 任意の有効な変数名を使用できます。 *args または *a が一般的ですが、プロジェクト全体にわたって同じ規則を使用するように努める必要があります。

この場合、*args は、この関数に任意の数 (0 を含む) の引数を受け付けるよう指示しています。 この関数内で、args は、すべての引数をタプルとして保持する変数として使用できるようになっています。 この関数を、任意の数または種類の引数を渡すことによって試してみてください。

variable_length()
()
variable_length("one", "two")
('one', 'two')
variable_length(None)
(None,)

見てわかるように、渡される引数の数または種類に関する制限はありません。

ロケット船は、打ち上げの前にいくつかの手順を実行します。 タスクまたは遅延によっては、これらの手順に計画より長い時間がかかることがあります。 各手順にかかる時間の長さが指定されたときに、打ち上げまでの分数を計算できる可変長関数を作成しましょう。

def sequence_time(*args):
    total_minutes = sum(args)
    if total_minutes < 60:
        return f"Total time to launch is {total_minutes} minutes"
    else:
        return f"Total time to launch is {total_minutes/60} hours"

この関数を、任意の分数を渡すことによって試してみてください。

sequence_time(4, 14, 18)
Total time to launch is 36 minutes.
sequence_time(4, 14, 48)
Total time to launch is 1.1 hours.

注意

可変個引数を使用するとき、各値には変数名が割り当てられなくなります。 すべての値が、アスタリスクを使用する "キャッチオール" 変数名 (これらの例では args) の一部になっています。

可変個キーワード引数

関数が任意の数のキーワード引数を受け付けるようにするために、同様の構文を使用します。 この場合は、次のように二重アスタリスクが必要です。

def variable_length(**kwargs):
    print(kwargs)

この関数の例を試してみてください。これは、kwargs として渡された名前と値を出力します。

variable_length(tanks=1, day="Wednesday", pilots=3)
{'tanks': 1, 'day': 'Wednesday', 'pilots': 3}

既に Python 辞書を使い慣れている場合は、可変長キーワード引数が辞書として割り当てられていることに気付くはずです。 変数と値を操作するには、同じ操作を辞書として使用します。

注意

可変個引数と同様に、可変個キーワード引数を使用しているときに kwargs を使用する必要はありません。 任意の有効な変数名を使用できます。 **kwargs または **kw が一般的ですが、プロジェクト全体にわたって同じ規則を使用するように努める必要があります。

この関数では、可変個キーワード引数を使用して、このミッションに割り当てられている宇宙飛行士を報告しましょう。 この関数では任意の数のキーワード引数が許可されるため、割り当てられている宇宙飛行士の数には関係なく関数を再利用できます。

def crew_members(**kwargs):
    print(f"{len(kwargs)} astronauts assigned for this mission:")
    for title, name in kwargs.items():
        print(f"{title}: {name}")

この関数をアポロ 11 号の乗組員で試してみてください。

crew_members(captain="Neil Armstrong", pilot="Buzz Aldrin", command_pilot="Michael Collins")
3 astronauts assigned for this mission:
captain: Neil Armstrong
pilot: Buzz Aldrin
command_pilot: Michael Collins

キーワード引数の任意の組み合わせを渡すことができるため、キーワードが繰り返されないようにしてください。 キーワードが繰り返されると、エラーが発生します。

crew_members(captain="Neil Armstrong", pilot="Buzz Aldrin", pilot="Michael Collins")
  File "<stdin>", line 1
SyntaxError: keyword argument repeated: pilot