検索ガイド -Search Guide-

単語と単語を空白で区切ることで AND 検索になります。
例: python デコレータ ('python' と 'デコレータ' 両方を含む記事を検索します)
単語の前に '-' を付けることで NOT 検索になります。
例: python -デコレータ ('python' は含むが 'デコレータ' は含まない記事を検索します)
" (ダブルクオート) で語句を囲むことで 完全一致検索になります。
例: "python data" 実装 ('python data' と '実装' 両方を含む記事を検索します。'python data 実装' の検索とは異なります。)
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
>>

【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) を辞書として受け取る ============
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 は、
渡す側では個別要素、もしくは、名前付き引数へのアンパック
受け取る側ではタプル、もしくは、辞書への整形、と覚えてください。
この記事に興味のある方は次の記事にも関心を持っているようです...
- People who read this article may also be interested in following articles ... -
【Python 雑談・雑学】 デコレータ (decorators) を理解しよう - デコレータ、オリジナル関数からの引数の渡し方、受け取り方
【Python 雑談・雑学】 関数への引数の渡し方 - 複数の個別の引数を取るのなら、ちゃんとアンパックして渡しましょう -
【Python 雑談・雑学 + coding challenge】sorted 組み込み関数の key パラメータをうまく使って、カスタムオブジェクトを簡単にソートしよう! __getitem__、__len__ 特殊関数 ( special methods, dunder methods ) を実装すれば立派なシーケンス ( sequence ) です
【 Effective Python, 2nd Edition 】引数として受け取った値を関数内で複数回「消費」する場合には要注意! イテレータ ( iterator ) とコンテナ ( container ) の違いをちゃんと認識しよう!
【 Effective Python, 2nd Edition 】keyword-only arguments (キーワード指定のみ引数) と positional-only arguments (位置指定のみ引数) を使いこなして、コードの読解性と将来的な拡張性を高めよう!
【 Using Asyncio in Python 】Python における asyncio を利用した非同期プログラム ( asynchronous programming ) の勉強を継続する前に、今一度スレッド ( thread ) についてのちょっとした復習ノート、まとめてみた
【Python 雑談・雑学 + coding challenge】Unicode の正規化処理 ( normalization ) を利用して、diacritical marks ( 発音区別符号 ) を取り除こう! テキスト解析の前処理としても重要です!