Python関数のパラメータ伝達*argsと*kwargs

2050 ワード

Python関数のパラメータ伝達*argsと*kwargs
パラメータ伝達メカニズムには、値伝達(int、float等値データ型)と参照伝達(辞書、リストなどの非値オブジェクトデータ型に代表される)の2つの基本メカニズムがあります.
値が渡され、適用されるパラメータは変更されません.(コピーを渡した)
a = 5
print(a)
def test(a):
    a+=1
    print("   :%d" % a)
test(a)
print(a)
​```output
5
   :6
5
​```

リファレンスが渡され、リファレンスのパラメータが変更されます(リアルなアドレスが渡されます)
a = [1,2,3]
print(a)
def test(a):
    a.append(4)
    print("   :",a)
test(a)
print(a)
​```
[1, 2, 3]
   : [1, 2, 3, 4]
[1, 2, 3, 4]
​```

ポイント
pythonでは、ラップ方式のパラメータ伝達も許可されています.これは、パラメータの個数とパラメータタイプを決定しない関数呼び出しに基礎を提供します.
知識点:
  • は、関数呼び出し時に*が単一の要素として元祖を解包し、独立したパラメータにします.
  • 関数呼び出し時、**はキー/値ペアの形式で辞書を解包し、独立したキーワードパラメータにします.
  • def f(a,*args):
        print(args)
    
    f(1,2,3,4)
    ​```
       :(2, 3, 4)
    ​```
    

    1,2,3,4が伝達されるが,解包は(1),(2,3,4)であり,そのうちaは1,argsは残りである.
    def f(a,b,*args):
        print(a)
        print(args)
    f([1,2,3,4,5])
    ​```   :
    1
    (3, 4, 5)   #      
    ​```
    

    pythonでは、*と**記号が関数定義のパラメータに表示されると、任意の数のパラメータが表示されます.*Argは任意の複数の無名パラメータを表し、タイプはtupleである.**kwargsはキーワードパラメータを表し、dictであり、使用時にargを*kwargsの前に置く必要があります.そうしないと、「SyntaxError:non-keyword arg after keyword arg」という構文エラーが発生します.
    *kwargsのパラメータ伝達の例を見てみましょう
    def f(**kargs):
        print(kargs)
        
    f(a=1,b=2) #          ,        
    ​```output:
    {'a': 1, 'b': 2}
    ​```
    
    def person(name,age,**kw):
        print('name:',name,'age:',age,'other:',kw)
    #   4   ,              
    person('Adam', 45, gender='M', job='Engineer')
    
    ​```output
    name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
    ​```
    
    

    *argsと*kwargsの混合例を見てみましょう
    def h(a,*args,**kwargs):
        print(a,args,kwargs)
    
    h(1,2,3,x=4,y=5)
    #            :1,2,3,x=4,y=5
    #   :1                    -a
    #   :(2,3)               -*args
    #   :{'x': 4, 'y': 5}     -**kwargs
    ​```output
    1 (2, 3) {'x': 4, 'y': 5}
    ​```