【Python 雑談・雑学】 関数への引数の渡し方・受け取り方 - *args、**kwargs を利用した引数の渡し方、パラメータの受け取り方、総復習 - 投稿一覧へ戻る
Published 2020年6月11日16:37 by mootaro23
SUPPORT UKRAINE
- Your indifference to the act of cruelty can thrive rogue nations like Russia -
ちょっと混乱している方がいるようなので。
今回は特に **kwargs を中心に整理してみます。
・名前付き引数 (named arguments) を辞書として受け取る ============
・ただ単に2つの引数を受け取る =========
・辞書の個別要素を named arguments として受け取る =========
・呼び出し側の **details により辞書が named arguments 引数となる ===========
すなわち named4(**details) => named4(name="Nana", age=26) となるので named1() と同じです。
ですから、呼び出し側で引数として **details を渡す場合、details の実体である辞書 (辞書でない場合はエラーになります) は
named arguments にアンパックされて渡されます [例は named3(), named4()]。
また、呼び出された側で **kwargs としてパラメータを取ると、kwargs の実体である named arguments は辞書として引き取られます [例は named1(), named4()]。
当たり前ですけど、named arguments として渡される元の辞書の key 名は、受け取る関数のパラメータ名と一致していなければいけません [例は named3()]。
では総復習です。
#1: 引数として辞書を渡します。この辞書は named arguments にアンパックされて関数が呼び出されます。
#2: 受け取った named arguments は **kwargs によって dictionary に整形されます。
#3: パラメータである dictionary をアンパックして named argument とし、それを引数として関数を呼び出します。
#4: 受け取った named arguments は **kwargs によって dictionary に整形されます。
#5: パラメータである dictionary を出力します。
#6: パラメータである dictionary の要素をアンパックして取り出します。
*args、**kwargs による引数の渡し方、パラメータの受け取り方がしっかり把握できていると、
関数を自作するときに格段に楽になり、幅も広がります。
*args、**kwargs は、
渡す側では個別要素、もしくは、名前付き引数へのアンパック、
受け取る側ではタプル、もしくは、辞書への整形、と覚えてください。
今回は特に **kwargs を中心に整理してみます。
・名前付き引数 (named arguments) を辞書として受け取る ============
def named1(**kwargs):
print(f"named1 => {kwargs}")
named1(name="Nana", age=26)
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)
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)
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)
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
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)
both(2, 4, 6, name="Saki", age=32)
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 は、
渡す側では個別要素、もしくは、名前付き引数へのアンパック、
受け取る側ではタプル、もしくは、辞書への整形、と覚えてください。
この記事に興味のある方は次の記事にも関心を持っているようです...
- People who read this article may also be interested in following articles ... -