*args と **kwargs
*args
Pythonでは、特別なシンボルを使って関数内で任意の数の引数を処理する方法が提供されています。これらのシンボルは*と**で、それぞれ変数名の前に付けて*argsと**kwargsを表します。*argsや**kwargsのパラメータ名は任意に付けることができますが、慣例的にargs(引数)やkwargs(キーワード引数)と呼ばれています。
*argsは、キーワード無しで任意の数の引数を関数に渡すために使われます。以下はその例です:
def add(*args):
res = 0 # 最終結果を0に初期化
for num in args: # 渡された引数のリストをループ
res += num # 各数値を合計に加算
return res
print(add(3, 5, 7, 9)) # 24このプログラムでは、argsは関数に渡された値を持つタプルです。つまり、上の例ではargsは(3, 5, 7, 9)となります。このようにして、関数に任意の数の引数を渡すことができます。
**kwargs
**kwargsは、キーワード付きで任意の数の引数を渡すことを可能にします。つまり、**kwargsを使用して任意の数のキーワード引数を関数に渡します。以下はその例です:
def introduce(**kwargs):
for key, value in kwargs.items(): # すべてのキーと値のペアをループ
print(f'{key}: {value}') # 各キーと値のペアを表示
introduce(Name='Alice', Age=25, Country='USA')
# 'Name: Alice'
# 'Age: 25'
# 'Country: USA'上のプログラムでは、kwargsは関数に渡されたキーと値のペアを持つ辞書です。つまり、上の例ではkwargsは{'Name': 'Alice', 'Age': 25, 'Country': 'USA'}となります。
また、*argsと**kwargsを関数呼び出しで組み合わせることもできます。*argsは**kwargsの前に置かなければなりません。
def combined_example(*args, **kwargs):
print(args) # 引数のタプルを表示
print(kwargs) # キーワード引数の辞書を表示
combined_example(1, 2, 3, Name='Alice', Age=25)
# (1, 2, 3)
# {'Name': 'Alice', 'Age': 25}この関数では、argsは値(1, 2, 3)を持つタプルで、kwargsは{'Name': 'Alice', 'Age': 25}を持つ辞書です。
任意の数の引数やキーワード引数を処理できるこの柔軟性は、関数をより動的で多用途にしたい場合に非常に有用です。
通常の関数引数と*argsおよび**kwargsの組み合わせ
*argsと**kwargsは、通常の関数引数と組み合わせて使用することができます。その場合、いくつかのルールを念頭に置く必要があります:
関数定義内の引数の正しい順序は、通常の引数、
*args、そして**kwargsの順になります。通常の引数(位置引数とも呼ばれます)は、常に
*argsと**kwargsの前に指定する必要があります。
def function_example(a, b, *args, **kwargs):
print(a) # 最初の通常の引数を表示
print(b) # 2番目の通常の引数を表示
print(args) # 追加のキーワード無しの引数を表示
print(kwargs) # キーワード引数を表示
function_example(1, 2, 3, 4, 5, Name='Alice', Age=25)
# 1
# 2
# (3, 4, 5)
# {'Name': 'Alice', 'Age': 25}ここで、1と2は関数定義のaとbに対応する通常の引数です。タプル(3, 4, 5)は、argsにまとめられる追加の引数を表しています。残りのキーワード引数は、辞書としてkwargsにまとめられます。
*argsや**kwargsを通常の引数と一緒に使用する場合、関数を呼び出すときに通常の引数を忘れないように注意してください。そうしないとTypeErrorが発生します。例えば、bの値を指定せずにfunction_example(1, Name='Alice', Age=25)と呼び出すと、エラーになります。