*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)
と呼び出すと、エラーになります。