通常の引数を可変長引数に
pythonで可変長引数を指定するには、仮引数に*
を指定する。関数の実装側では、仮引数をタプルとして扱える。
def func1(a, *others):
print(a, others)
func1(1) # 1, ()
func1(1, 2) # 1, (2,)
func1(1, 2, 3) # 1, (2, 3)
逆の使い方として、タプルやリストなどのシーケンス型に*
をつけると実引数に展開して呼び出すことができる。
以下の例ではa, b, cの引数をそれぞれ指定するのではなく、リストの要素を展開してa,b,cに割り当てている。要素数が引数の数と合わない場合はエラーになる(多くても少なくても)。
def func2(a, b, c):
print("a={}, b={}, c={}".format(a, b, c))
params = [1, 2, 3])
func2(*params) # a=1, b=2, c=3
キーワード引数を可変長引数に
pythonでは引数を名前付きで指定することもできる。任意のキーワードで引数を受け付けるには、**
をつける。
この場合はdictで扱える。
def func3(a, **others):
print(a, others)
func3(1, b=2, c=3) # 1 {'b':2, 'c': 3}
通常の引数と同じように実引数のほうに **
をつけることで、dict型をキーワード引数に展開できる。
def func2(a, b, c):
print("a={}, b={}, c={}".format(a, b, c))
params = {'a':1, 'b':2, 'c':3}
func2(**params) # a=1, b=2, c=3
任意の引数を受け取れる関数
以下のように リスト形式の可変長引数*args
と、 dict形式の引数**kwargs
を受け取るようにすると、どのような引数でも受け付けられるようになる。
def func(*args, **kwargs):
print(args, kwargs)