python関数パラメータの定義と解析(アスタリスクパラメータを含む)

4789 ワード

前言:pythonでの関数パラメータの伝達は、値を割り当てることによって伝達されます.関数のパラメータには2つの点に注意してください.1.関数パラメータがどのように定義されているか2.関数を呼び出す過程でパラメータがどのように解析されるか
文書ディレクトリ
  • python関数パラメータの定義方法
  • func(arg1, arg2, ...)
  • func(arg1, arg2=value2, ...)
  • func(*args)-不定長位置パラメータ関数
  • func(**kwargs)-不定長キーワードパラメータ関数
  • python関数パラメータの解析方式
  • 注意
  • python関数パラメータの定義方法
    func(arg1, arg2, …)
    これは最も一般的な定義方法で、1つの関数は任意のパラメータを定義することができ、各パラメータ間はカンマで分割され、このように定義された関数は呼び出し時にも関数名の後の括弧に数の等しい値を提供しなければならない.つまり、この呼び出し方式では、形パラメータと実パラメータの個数が一致し、一つ一つ対応しなければならない.すなわち,最初のパラメータはこの最初の実パラメータに対応する.例:
    def func(x, y):
        print x,y
    

    この関数を呼び出すと、func(1,2)はxが1,yが2をとり、パラメータは実パラメータに対応し、func(y=2,x=1)も同じ効果を達成する.しかしfunc(1)またはfunc(1,2,3)はエラーを報告します.
    func(arg1, arg2=value2, …)
    この関数定義方式は、第1のパラメータに対してデフォルトパラメータを提供し、すなわち、関数を呼び出すときにデフォルトパラメータにパラメータを渡さなくてもよい.例:
    def func(x, y=3):
        print x,y
    

    この関数を呼び出すと,func(1,2)は同様にxが1,yが2をとるが,func(1)であればエラーは報告されず,このときxが1,yはデフォルトの3となる.1つ目と同様に、パラメータ位置を交換することも可能であり、例えばfunc(y=8,x=3)をこのような形式で用いることも可能である.
    func(*args)——不定長位置パラメータ関数
    上記の2つの方法は、複数のパラメータがある場合、複数の実パラメータが入力されますが、複数のパラメータがあるかどうか分からない場合があります.この場合、3つ目の方法が役立ちます.この関数の実パラメータの数は、1つの*にパラメータ名を付ける方法で表され、0つまたは複数になる可能性があります.いくつかにかかわらず、関数の内部には、パラメータ名を識別子とするtupleに格納されることに注意してください.例:
    def func1(*args):
        if len(args) == 0:
            print('args: None')
        else:
            print('args:', args)
     
     func1()             >>  args: None
     func1(1, 2, 3)      >>  args:(1, 2, 3)
     func1(x=1,y=2,z=3)  >>  TypeError: func1() got an unexpected keyword argument 'x'
    

    func(**kwargs)——不定長キーワードパラメータ関数
    最後の方法は、パラメータの前に2つの星を付け、パラメータは関数の内部にパラメータ名を識別子とする辞書に格納されます.この場合、関数を呼び出す方法はarg 1=value 1、arg 2=value 2のような形式を採用する必要があります.例:
    def func1(**args):
        if len(args) == 0:
            print('args: None')
        else:
            print('args:', args)
    
    func1()                >> args: None
    func1(x=1, y=2, z=3)   >> args: {'x': 1, 'y': 2, 'z': 3}
    func1(1, 2, 3)         >> TypeError: func1() takes 0 positional arguments but 3 were given
    

    python関数パラメータの解析方法
    python関数パラメータの解析方式は,前に定義した4つの方法で優先度が順次低下し,1,2,3,最後の4であった.すなわち,まず方式1におけるargを解析し,次に解析方式2におけるarg=valueを解析し,さらに解析方式3,すなわち,より多く出たargという形式の実参からなるtupleを伝達し,最後に残りのkey=valueという形式の実参からなるdictionaryを構成して2つの星番号を持つ形参に伝達する方式4である.例:
    def func_test(w, x=1, *y, **z):
        print(w, x, y, z)
    
    func_test(1)           >> 1 1 () {}
    func_test(1,2)         >> 1 2 () {}
    func_test(1,2,3)       >> 1 2 (3,) {}
    func_test(1,2,3,4)     >> 1 2 (3, 4) {}
    func_test(w=1,x=2)     >> 1 2 () {}
    func_test(w=1,y=2)     >> 1 1 () {'y': 2}
    func_test(1,2,3,y=4)   >> 1 2 (3,) {'y': 4}
    func_test(1,2,3,x=4)   >> TypeError: func_test() got multiple values for argument 'x'
    
    def foo(*args, **kwarg):
        for item in args:
            print(item)
        for k,v in kwarg.items():
            print(k,v)
        print(30*'=')
    
    if __name__ == '__main__':
        v1 = (1, 2, 3)
        v2 = [4, 5, 6]
        d = {'a':11, 'b':12}
        foo(v1, d)
        foo(*v1, **d)
        foo(v2, d)
        foo(*v2, **d)
    
        :
    (1, 2, 3)
    {'a': 11, 'b': 12}
    ==============================
    1
    2
    3
    a 11
    b 12
    ==============================
    [4, 5, 6]
    {'a': 11, 'b': 12}
    ==============================
    4
    5
    6
    a 11
    b 12
    ==============================
    

    上記の例では、v 1、v 2、dにアスタリスクが付いていない場合はパラメータとして関数に渡され、アスタリスクが付いている場合はパケットを解いて関数に渡されると説明しています.
    に注意
  • 可変位置パラメータ*argsはメタグループであり、変更不可である.例えば、
  • def func(*args):
        args[0] = 4
    
    func(1, 2, 3)    >> TypeError: 'tuple' object does not support item assignment
    
  • 辞書タイプについては、1つの型番*のみを使用すると、辞書のキーのみが入力されます.たとえば、
  • def func(*args, **kwarg):
    	print args, kwarg
    
    d = {'a':1, 'b':2, 'c':3}
    func(*d)   >> ('a', 'b', 'c') {}
    func(**d)  >> () {'a': 1, 'b': 2, 'c': 3}
    
  • 辞書またはメタグループタイプのパラメータを1タイプ定義の関数に解析的に入力できます.たとえば、
  • です.
    def func(a, b):
        print("a: %d, b: %d" % (a, b))
        c = a-b
        return c
        
    d = {"b": 5, "a": 3}
    e = (3, 5)
    f = (5, 3)
    
    def main():
        i = func(**d)
        print("result: %d" %i)
        j = func(*e)
        print("result: %d" %j)
        k = func(*f)
        print("result: %d" %k)
        m = func(b=2, a=1)
        print(m)
    
    if __name__ == '__main__':
        main()
    
        :
    a: 3, b: 5
    result: -2
    a: 3, b: 5
    result: -2
    a: 5, b: 3
    result: 2
    a: 1, b: 2
    result: -1