*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