*args **kwargsの意味
インターネットでPythonの資料を読んでいると関数の引数の記述で"*args"や"**kwargs"というものがありました。調べてみると2つの意味があるようです。
どんな引数にも対応できる関数
一つ目は関数定義に使用した場合、頭に"*"が付いた変数は、余った引数を受け取るタプルという意味になります。また"**"が付いた変数は、余ったキーワード引数を受け取り、辞書として機能します。
つまり、引数に(*args、**kwargs)を入れておけば、どんな引数でも受け取れることを意味しています。例えば、次のように
#coding: shift-jis
def func(*args, **kwargs):
print "args=", args,
print "kwargs=", kwargs
print "func(1,\"ABC\",[1,2,3]):"
func(1,"ABC",[1,2,3])
print "func(a=123,b=\"ABC\",c=[4,5,6]):"
func(a=123,b="ABC",c=[4,5,6])
print "func(1,\"ABC\",[1,2,3],a=123,b=\"ABC\",c=[4,5,6]):"
func(1,"ABC",[1,2,3],a=123,b="ABC",c=[4,5,6])
raw_input()
出力画面:
func(1,"ABC",[1,2,3]):
args= (1, 'ABC', [1, 2, 3]) kwargs= {}
func(a=123,b="ABC",c=[4,5,6]):
args= () kwargs= {'c': [4, 5, 6], 'b': 'ABC', 'a': 123}
func(1,"ABC",[1,2,3],a=123,b="ABC",c=[4,5,6]):
args= (1, 'ABC', [1, 2, 3]) kwarg= {'c': [4, 5, 6], 'b': 'ABC', 'a': 123}
アンパックして引数リストを渡す
もう一つの使い方は、リストや辞書を引数として渡すとき、頭に"*"や"**"をつけることで、リストや辞書を分解して変数を渡すことが出来ます。使用例は次のようになります。
#coding: shift-jis
def func(a=3,b=4,c=5):
return a*b+c
args = [1,2,3]
kw = {"b":6,"c":7,"a":5}
print "func():", func()
print "func(*args):", func(*args) ←リストを分解して渡しています。
print "func(**kw):", func(**kw) ←辞書を分解して渡しています。
raw_input()
出力画面:
func(): 17
func(*args): 5
func(**kw): 37