note.nkmk.me

Pythonで関数の引数にリスト、タプル、辞書を展開して渡す

Date: 2018-03-01 / tags: Python, リスト, 辞書
このエントリーをはてなブックマークに追加

Pythonではリスト(配列)、タプル、辞書を展開して、それぞれの要素を関数の引数にまとめて渡すことができる。

関数呼び出し時に、リストとタプルには*、辞書には**をつけて引数に指定する。

Pythonの関数のデフォルト引数や可変長引数については以下の記事を参照。

スポンサーリンク

リストやタプルに*を付けて展開

リスト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

以下、リストの場合で説明するがタプルでも同じ。

要素数と引数の数が一致していないとエラー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

デフォルト引数が設定されている関数の場合

デフォルト引数が設定されている場合、要素数が足りないとデフォルト引数が使われる。要素数が多いとエラー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

可変長引数が設定されている関数の場合

可変長引数が設定されている場合、位置引数分の要素以降の要素がすべて可変長引数に渡される。

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

辞書に**を付けて展開

辞書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

引数名と一致するキーが無かったり、一致しないキーがあったりするとエラー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'

デフォルト引数が設定されている関数の場合

辞書のキーと一致する引数名の値のみが更新されるイメージ。

引数名と一致しないキーがあるとエラー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'

可変長引数が設定されている関数の場合

可変長引数が設定されている場合、引数として指定されている引数名以外のキーを持つ要素はすべて可変長引数に渡される。

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
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事