【Python 雑談・雑学】 関数への引数の渡し方・受け取り方 - *args、**kwargs を利用した引数の渡し方、パラメータの受け取り方、総復習 - 投稿一覧へ戻る

Tags: Python , miscellaneous , unpack , kwargs , argument , args , parameter

Published 2020年6月11日16:37 by T.Tsuyoshi

ちょっと混乱している方がいるようなので。
今回は特に **kwargs を中心に整理してみます。


・名前付き引数 (named arguments) を辞書として受け取る ============

def named1(**kwargs):
print(f"named1 => {kwargs}")

named1(name="Nana", age=26)

# named1 => {'name': 'Nana', 'age': 26}




・ただ単に2つの引数を受け取る =========
def named2(name, age):
print(f"named2 => name: {name}, age: {age} ")

details = {"name": "Nana", "age": 26}

named2(details, 26)

# named2 => name: {'name': 'Nana', 'age': 26}, age: 26




・辞書の個別要素を named arguments として受け取る =========
def named3(name, age):
print(f"named3 => name: {name}, age: {age} ")

details = {"name": "Nana", "age": 26}

named3(**details)

# named3 => name: Nana, age: 26




・呼び出し側の **details により辞書が named arguments 引数となる ===========
すなわち named4(**details) => named4(name="Nana", age=26) となるので named1() と同じです。
def named4(**kwargs):
print(f"named4 => {kwargs}")

details = {"name": "Nana", "age": 26}

named4(**details)

# named4 => {'name': 'Nana', 'age': 26}




ですから、呼び出し側で引数として **details を渡す場合、details の実体である辞書 (辞書でない場合はエラーになります) は
named arguments にアンパックされて渡されます [例は named3(), named4()]。


また、呼び出された側で **kwargs としてパラメータを取ると、kwargs の実体である named arguments は辞書として引き取られます [例は named1(), named4()]。


当たり前ですけど、named arguments として渡される元の辞書の key 名は、受け取る関数のパラメータ名と一致していなければいけません [例は named3()]。


では総復習です。


def named(**kwargs): #4
print(kwargs) #5 => {'name': 'Nana', 'age': 26}


def print_nicely(**kwargs): #2
named(**kwargs) #3
for key, value in kwargs.items(): #6
print(f"{key}: {value}")

friend = {"name": "Nana", "age": 26}
print_nicely(**friend) #1

#1: 引数として辞書を渡します。この辞書は named arguments にアンパックされて関数が呼び出されます。
#2: 受け取った named arguments は **kwargs によって dictionary に整形されます。
#3: パラメータである dictionary をアンパックして named argument とし、それを引数として関数を呼び出します。
#4: 受け取った named arguments は **kwargs によって dictionary に整形されます。
#5: パラメータである dictionary を出力します。
#6: パラメータである dictionary の要素をアンパックして取り出します。


*args、**kwargs による引数の渡し方、パラメータの受け取り方がしっかり把握できていると、
関数を自作するときに格段に楽になり、幅も広がります。


def both(*args, **kwargs):
print(args)
print(kwargs)


numbers = [1, 3, 5]
friend = {"name": "Nana", "age": 26}

both(*numbers, **friend)

# (1, 3, 5)
# {'name': 'Nana', 'age': 26}



both(2, 4, 6, name="Saki", age=32)

# (2, 4, 6)
# {'name': 'Saki', 'age': 32}





*args、**kwargs は、
渡す側では個別要素、もしくは、名前付き引数へのアンパック
受け取る側ではタプル、もしくは、辞書への整形、と覚えてください。

この投稿をメールでシェアする

0 comments

コメントはまだありません。

コメントを追加する(不適切と思われるコメントは削除する場合があります)