Pythonで関数の引数にリスト、タプル、辞書を展開して渡す
Pythonではリスト(配列)、タプル、辞書を展開して、それぞれの要素を関数の引数にまとめて渡すことができる。
関数呼び出し時に、リストやタプルには*
、辞書には**
をつけて引数に指定する。アスタリスク*
の数に注意。
ここでは以下の内容について説明する。
- リストやタプルに
*
を付けて展開- デフォルト引数が設定されている関数の場合
- 可変長引数が設定されている関数の場合
- 辞書に
**
を付けて展開- デフォルト引数が設定されている関数の場合
- 可変長引数が設定されている関数の場合
Pythonの関数の基本的な使い方やデフォルト引数、関数定義時に*
, **
をつける可変長引数については以下の記事を参照。
- 関連記事: Pythonで関数を定義・呼び出し(def, return)
- 関連記事: Pythonの関数でのデフォルト引数の使い方と注意点
- 関連記事: Pythonの可変長引数(
*args
,**kwargs
)の使い方
スポンサーリンク
リストやタプルに*を付けて展開
リストlist
やタプルtuple
に*
を付けて引数に指定すると、展開されてそれぞれの要素が個別の引数として渡される。
def func(arg1, arg2, arg3):
print(arg1)
print(arg2)
print(arg3)
l = ['one', 'two', 'three']
func(*l)
# one
# two
# three
func(*['one', 'two', 'three'])
# one
# two
# three
t = ('one', 'two', 'three')
func(*t)
# one
# two
# three
func(*('one', 'two', 'three'))
# one
# two
# three
source: argument_expand_list_tuple.py
以下、リストの場合で説明するがタプルでも同じ。
要素数と引数の数が一致していないとエラーTypeError
になる。
# func(*['one', 'two'])
# TypeError: func() missing 1 required positional argument: 'arg3'
# func(*['one', 'two', 'three', 'four'])
# TypeError: func() takes 3 positional arguments but 4 were given
source: argument_expand_list_tuple.py
デフォルト引数が設定されている関数の場合
デフォルト引数が設定されている場合、要素数が足りないとデフォルト引数が使われる。要素数が多いとエラーTypeError
。
def func_default(arg1=1, arg2=2, arg3=3):
print(arg1)
print(arg2)
print(arg3)
func_default(*['one', 'two'])
# one
# two
# 3
func_default(*['one'])
# one
# 2
# 3
# func_default(*['one', 'two', 'three', 'four'])
# TypeError: func_default() takes from 0 to 3 positional arguments but 4 were given
source: argument_expand_list_tuple.py
可変長引数が設定されている関数の場合
可変長引数が設定されている場合、位置引数分の要素以降の要素がすべて可変長引数に渡される。
def func_args(arg1, *args):
print(arg1)
for arg in args:
print(arg)
func_args(*['one', 'two'])
# one
# two
func_args(*['one', 'two', 'three'])
# one
# two
# three
func_args(*['one', 'two', 'three', 'four'])
# one
# two
# three
# four
source: argument_expand_list_tuple.py
辞書に**を付けて展開
辞書dict
に**
を付けて引数に指定すると、要素のキーkey
が引数名、値value
が引数の値として展開されて、それぞれ個別の引数として渡される。
def func(arg1, arg2, arg3):
print(arg1)
print(arg2)
print(arg3)
d = {'arg1': 'one', 'arg2': 'two', 'arg3': 'three'}
func(**d)
# one
# two
# three
func(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three'})
# one
# two
# three
source: argument_expand_dict.py
引数名と一致するキーが無かったり、一致しないキーがあったりするとエラーTypeError
になる。
# func(**{'arg1': 'one', 'arg2': 'two'})
# TypeError: func() missing 1 required positional argument: 'arg3'
# func(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three', 'arg4': 'four'})
# TypeError: func() got an unexpected keyword argument 'arg4'
source: argument_expand_dict.py
デフォルト引数が設定されている関数の場合
辞書のキーと一致する引数名の値のみが更新されるイメージ。
引数名と一致しないキーがあるとエラーTypeError
になる。
def func_default(arg1=1, arg2=2, arg3=3):
print(arg1)
print(arg2)
print(arg3)
func_default(**{'arg1': 'one'})
# one
# 2
# 3
func_default(**{'arg2': 'two', 'arg3': 'three'})
# 1
# two
# three
# func_default(**{'arg1': 'one', 'arg4': 'four'})
# TypeError: func_default() got an unexpected keyword argument 'arg4'
source: argument_expand_dict.py
可変長引数が設定されている関数の場合
可変長引数が設定されている場合、引数として指定されている引数名以外のキーを持つ要素はすべて可変長引数に渡される。
def func_kwargs(arg1, **kwargs):
print('arg1', arg1)
for k, v in kwargs.items():
print(k, v)
func_kwargs(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three'})
# arg1 one
# arg2 two
# arg3 three
func_kwargs(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three', 'arg4': 'four'})
# arg1 one
# arg2 two
# arg3 three
# arg4 four
func_kwargs(**{'arg1': 'one', 'arg3': 'three'})
# arg1 one
# arg3 three
source: argument_expand_dict.py
スポンサーリンク