pythonの*argsと*kwargs可変パラメータを深く理解する

7755 ワード

前の記事ではpython関数のパラメータ伝達方法について詳しく説明しましたが、本稿では上記のように可変パラメータ*args**kwargsについて詳しく説明します.
  • 本文の主な内容:
  • 可変パラメータの定義
  • パラメータ伝達(*)アスタリスク
  • を理解する
  • *args非キー値可変パラメータの定義
  • パラメータ伝達(**)双星号
  • を理解する
  • **kwargsキー値可変パラメータの定義
  • 可変パラメータの混合呼び出しと定義
  • 1.可変パラメータ定義
    関数を定義する場合、呼び出すときに何個のパラメータがあるか分からない場合があります.可変パラメータを使用できます.
    def func(required_arg, default_arg=None, *args, **kwargs):
        pass
        #  required_arg       
        #  default_arg     
        # *args        
        # **kwargs       
    

    pythonの4つのパラメータ定義方式を簡単に説明したPythonの典型的な関数定義です
  • required_Arg必伝位置パラメータ
  • default_Argデフォルトパラメータ
  • *args非キー値可変パラメータ
  • **kwargsキー値可変パラメータ
  • 注意:これらのパラメータには順序があります.位置パラメータ>デフォルトパラメータ>非キー値可変パラメータ>キー値可変パラメータ
    今日は主に可変パラメータについて説明します.Pythonには特殊な文法があります.(単星号)(双星号)では、数の可変パラメータを関数に渡すことができます.一般的にargsとkwargsを書く方法が一般的で、argsとkwargsは変数名にすぎず、varsと*varsを書いて同じ結果を実現することができます.
    *argsは、キー値が長くなるパラメータリストを渡す機能です.**kwargsは通常、キーワードが長くなるパラメータを渡すために使用されます.
    2.パラメータ伝達(*)アスタリスクの理解
    >>> def add(x, y):
    ...     print("x:",x)
    ...     print("y:",y)
    ...     print("sum:", x+y)
    

    簡単な関数addを定義します.通常の呼び出し方法です.
    >>> add(1, 2)
    x: 1
    y: 2
    sum: 3
    >>> add(x=1, y=2)
    x: 1
    y: 2
    sum: 3
    
    

    面と向かってパラメータプログラムをマルチパスまたは少ないパスすると異常が放出されます
    >>> add(1)
      Traceback (most recent call last):
      File "", line 1, in 
      TypeError: add() missing 1 required positional argument: 'y'
    >>> add(1,2,3)
      Traceback (most recent call last):
      File "", line 1, in 
      TypeError: add() takes 2 positional arguments but 3 were given
    

    1つの変数で複数のパラメータを転送したい場合は、どうやって転送しますか?
    >>> nums = (1,2)
    >>> add(nums)
      Traceback (most recent call last):
      File "", line 1, in 
      TypeError: add() missing 1 required positional argument: 'y'
    

    パラメータ値をtupleにカプセル化し、addに直接渡してプログラムが異常パラメータの欠落を投げ出しました.それでは、パラメータをどのように伝達するか、*番号を使用します.
    >>> nums = (1,2)
    >>> add(*nums)
    x: 1
    y: 2
    sum: 3
    
    >>> nums = (1,2,3)
    >>> add(*nums)
      Traceback (most recent call last):
      File "", line 1, in 
      TypeError: add() takes 2 positional arguments but 3 were given
    

    上記の実行結果により、numsの前に加算し、numsの数がパラメータと一致すれば呼び出すことができます.これはなぜですか.ここではシーケンス化解包という知識点があり、メタグループを渡すときにメタグループの各要素に位置パラメータを対応させ、numsが関数に渡すとプログラムは自動的に解包して位置パラメータにマッピングします.
    3.*args非キー値可変パラメータの定義
    関数を定義する際に,非キー値パラメータの個数が確認できないことに気づいた場合,可変非キー値パラメータとして定義できる.
    def add(*args): 
    ...     sum = 0
    ...     for arg in args: #args    
    ...             print(arg)
    ...             sum += arg
    ...     print("sum:", sum)
    

    我々は*args代表を通じて可変パラメータリストを受信します.では、可変パラメータリストの関数をどのように呼び出しますか.
    >>> add() #    
    sum: 0
    >>> add(1,2,3)#        
    1
    2
    3
    sum: 6
    >>> nums = (1,2,3)#          *   
    >>> add(*nums)
    1
    2
    3
    sum: 6
    

    上記の呼び出し方式argsで定義した関数から、0個または-個以上のパラメータを伝達することができ、位置パラメータで伝達することもできるし、伝達することもできる.
    位置パラメータと可変パラメータ*argsの解包関係
    def add(num, *args): 
    ...     print("num:", num)
    ...     sum = 0
    ...     for arg in args: #args    
    ...             print(arg)
    ...             sum += arg
    ...     print("sum:", sum)
    

    パラメータを送信しないと、プログラムがエラーを報告します.1つ目は必ず位置パラメータを送信するので、送信しないと異常が放出されます.
    >>> add()
    Traceback (most recent call last):
      File "", line 1, in 
    TypeError: add() missing 1 required positional argument: 'num'
    

    パラメータを渡すと、プログラムは正常に実行され、numは入力されたパラメータ値を取得し、argsは値を取得しませんでした.
    >>> add(1)
    num: 1
    sum: 0
    

    2つのパラメータを渡すと、プログラムは正常に実行され、numは最初のパラメータ値を取得し、argsは第2のパラメータを取得します.
    >>> add(1, 2)
    num: 1
    2
    sum: 2
    

    3つのパラメータを渡すと、プログラムは正常に実行され、numは最初のパラメータ値を取得し、argsは最初の後のパラメータを取得します.
    >>> add(1, 2, 3)
    num: 1
    2
    3
    sum: 5
    

    メタ先祖を渡すと、プログラムは正常に実行され、numは最初のパラメータ値を取得し、argsは最初の後のパラメータを取得します.
    >>> nums = (1,2,3)
    >>> add(*nums)
    num: 1
    2
    3
    sum: 5
    

    以上より,argsを用いて関数を定義する場合,可変パラメータ(args)の前に位置パラメータがある場合,解包パラメータは位置パラメータに優先的に付与され,残りの変数は可変パラメータに付与されることが分かった.
    パラメータ伝達(**)双星号の理解
    >>> def fun(x, y, z):
    ...     print("x:", x)
    ...     print("y:", y)
    ...     print("z:", z)
    ... 
    >>> fun(1,2,3)
    x: 1
    y: 2
    z: 3
    >>> fun(x=1,y=2,z=3)
    x: 1
    y: 2
    z: 3
    >>> fun(1,y=2,z=3)
    x: 1
    y: 2
    z: 3
    
    

    呼び出し関数funcは以上の方法で参照できますが、他の方法はありますか?はい、それは**を通じてです.
    >>> nums = {"x":1,"y":2, "z":3}
    >>> fun(**nums)
    x: 1
    y: 2
    z: 3
    >>> nums = {"y":2, "z":3}
    >>> fun(1, **nums)
    x: 1
    y: 2
    z: 3
    

    パラメータを辞書にカプセル化し、*numsで関数funcに渡すことができます.実現原理は何ですか.*は、解包付与位置パラメータ**は解包付与キーワードパラメータである(キーワードパラメータは前文参照)
    **kwargsキー値可変パラメータの定義
    「**kwargs」で関数を定義し、kwargsは通常のパラメータリスト以外のキー値パラメータ辞書を受信します.キー値可変パラメータを渡す必要がある場合は、次のように関数を定義します.
    def func(**kwargs):
    >>> def func(**kwargs):
    ...     for key, value in kwargs.items(): #kwargs      
    ...             print("key:", key, " value:", value)
    ... 
    
    

    私たちは*kwargs代表を通じて可変パラメータ辞書を受信します.では、可変パラメータ辞書の関数を呼び出すにはどうすればいいですか.
    >>> func(a=1,b=2)
    key: a  value: 1
    key: b  value: 2
    >>> nums = {"a": 1, "b": 2}
    >>> func(**nums)
    key: a  value: 1
    key: b  value: 2
    
    

    上の呼び出し方式**kwargsで定義した関数は、キーワードパラメータで渡すことも、辞書で渡すこともできます.
    6.可変パラメータの混合呼び出しと定義
    位置パラメータ、デフォルトパラメータ、可変パラメータの混合使用は、基本原則として、先位置パラメータ、デフォルトパラメータ、非キー値可変パラメータ(args)、キー値可変パラメータ(kwargs)
    def func(required_arg, default_arg=None, *args, **kwargs):
        pass
        #  required_arg       
        #  default_arg     
        # *args        
        # **kwargs       
    

    argsと*kwargsの違い
    >>> def func(*args, **kwargs):
    ...     print("args:", args)
    ...     print("kwargs", kwargs)
    ... 
    
    >>> func(1,2)
    args: (1, 2)
    kwargs {}
    >>> func(a=1, b=2)
    args: ()
    kwargs {'a': 1, 'b': 2}
    >>> func(1,2,a=1, b=2)
    args: (1, 2)
    kwargs {'a': 1, 'b': 2}
    
    *argsは、tupleである任意の複数の非キー値パラメータを表すことがわかる.**kwargsは、dictであるキーワードパラメータを表す.また、*args**kwargsを併用する場合、*argsパラメータ列を**kwargsの前にしなければならず、func(a=1, b='2',1,2 )のように呼び出すと、構文エラー“SyntaxError: non-keyword arg after keyword arg”が提示される
    *argsと位置パラメータとデフォルトパラメータの混在
    argsと位置パラメータとデフォルトパラメータの混用:argsは位置パラメータの後に置く
    def func(a, *args, b=1):
    ...     print("a:", a)
    ...     print("b:", b)
    ...     print("args:", args)
    ... 
    

    **kwargsと位置パラメータとデフォルトパラメータの混在
    **kwargsはデフォルトパラメータの後に置く
        
    def func(a,  b=1,**kwargs):
    ...     print("a:", a)
    ...     print("b:", b)
    ...     print("args:", args)
    ... 
    
        
    def func(a, **kwargs, b=1):
    ...     print("a:", a)
    ...     print("b:", b)
    ...     print("args:", args)
    ... 
    SyntaxError: invalid syntax
    

    まとめ
    関数の4種類のパラメータ伝達方式、位置パラメータ、キーワードパラメータ、デフォルトパラメータ、可変パラメータ理解*(単星番号)、*(双星番号)のパラメータ伝達方式*argsと**kwargsは特殊なキーワード関数であり、可変長パラメータを使用することができます.*argsは、可変数のnon-keywordedパラメータのリストとリストの操作で実行できます.*kwargsは、変数数のキーワードパラメータ辞書機能辞書で実行できる操作です.注意:異なるタイプのパラメータ定義と伝達には順序が必要です.