しょっちゅう忘れるのでメモ。
可変長引数
*args
を引数に指定すると、任意の数の引数を受け取ってタプルになる。
>>> def func(a, b, *args):
... print('a: {}'.format(a))
... print('b: {}'.format(b))
... print('*args: {}'.format(args))
...
>>> func(1, 2, 3, 4, 5, 6)
a: 1
b: 2
*args: (3, 4, 5, 6)
**kargs
を引数に指定すると、任意の数のキーワード引数を受け取って辞書になる。
>>> def func(a, b, **kargs):
... print('a: {}'.format(a))
... print('b: {}'.format(b))
... print('**kargs: {}'.format(kargs))
...
>>> func(1, 2, x=3, y=4, z=5)
a: 1
b: 2
**kargs: {'z': 5, 'x': 3, 'y': 4}
アンパック代入
リストに*
をつけて引数に渡すとアンパックされて引数に代入される。
>>> args = [1, 2, 3]
>>> def func(a, b, c):
... return a + b + c
...
>>> func(*args)
6
辞書に**
をつけて引数に渡すとアンパックされて引数に代入される。
>>> kargs = {'a': 3, 'b': 4, 'c': 5}
>>> def func(a, b, c):
... return a + b + c
...
>>> func(**kargs)
12
こんなことも
>>> args = [3, 4, 5]
>>> def func(a, b, *args):
... print('a: {}'.format(a))
... print('b: {}'.format(b))
... print('*args: {}'.format(args))
...
>>> func(1, 2, *args)
a: 1
b: 2
*args: (3, 4, 5)
*args
で引数に渡すことでアンパックされ、関数は可変長引数として受け取るのでリストになる。
最初からリストで渡せという話だけどこんなこともできる。