Python変長パラメータ、パラメータ解包

5377 ワード

長くなる関数パラメータに対してphpでは配列,jsではオブジェクトを用いてパラメータを伝達できることを知った.関数パラメータを収集するphpで使用する方法はfunc_ですget_args()は、jsではargumentsプロパティを使用して取得されます(このプロパティは配列に似ています).
pythonでは、どのようにして長くなるパラメータを取得しますか?
第一:リスト、辞書、メタグループの使用
たとえばdef demo(x):      for s in x:          print (s)
ここで、メタグループには可変性があるため、関数内でメタグループを変更するべきではありません.そうしないと、次のようにエラーが発生します.def demo(x):      x[ 0 ] = 1 demo(( 1 , 2 , 3 , 4 )) """ Traceback (most recent call last): .... TypeError: 'tuple' object does not support item assignment """
第二:可変パラメータの使用def demo( * args, * * kargs):      print (args)      print (kargs) demo() """ () {} """ demo( 1 , 2 ) """ (1,2) {} """ demo(c = 'a' ,b = 'd' ) """ () {'c': 'a', 'b': 'd'} """ demo( 1 , 2 ,c = 'a' ,b = 'd' ) """ (1, 2) {'c': 'a', 'b': 'd'} """
ここで、*argsはすべての位置に関連するパラメータを収集し、1つのメタグループに配置し、最後にこのメタグループをargsに割り当て、*kargsポインタはキーワードパラメータ(a=3のタイプを指す)に対して、これらのキーワードパラメータは対応する辞書に配置され、kargsに同様の値が与えられる.
これに対してpythonには解包パラメータもあります.以下のプログラムを参照def demo(a,b,c):      print (a,b,c)
通常の呼び出しの場合、demo(1,2,3)のような3つのパラメータを伝達しなければなりませんが、パケット解除パラメータがあれば、1つのメタグループだけで実現できます.def demo(a,b,c):      print (a,b,c) arg = ( 1 , 2 , 3 ) demo(arg) """ Traceback (most recent call last): ... TypeError: demo() takes exactly 3 arguments (1 given) """ demo( * arg) """ (1, 2, 3) """
*argはメタグループを解くことができますが、*argは辞書を解くことができます.以下のプログラムを参照してください.def demo(a,b,c):      print (a,b,c) arg = { 'a' : 4 , 'b' : 5 , 'c' : 6 } demo( * * arg) #(4, 5, 6)
注意収集パラメータとパラメータの解包形式は似ているので、違いに注意してください.収集関数は,パラメトリックパラメータでは*,**を用いてパラメータ解包を実現し,実パラメータでは*,**を用いて実現する.
以上の基礎を持ってmap()の実現をシミュレートしますdef mymap(func, * seqs):      res = []      for args in zip ( * seqs):          res.append(func( * args))      return res print (mymap( abs ,[ - 2 , - 1 , 0 , 1 , 2 ])) """ seqs ([-2,-1,0,1,2],) *seqs zip, (-2,),(-1,),(0,),(1,),(2,) abs(-2),abs(-1),abs(0),abs(1),abs(2) """ print (mymap( pow ,[ 1 , 2 , 3 ],[ 2 , 3 , 4 , 5 ])) """ zip() *seqs (1,2),(2,3),(3,4) , pow pow(1,2),pow(2,3),pow(3,4) """