Python変長パラメータ、パラメータ解包
5377 ワード
長くなる関数パラメータに対してphpでは配列,jsではオブジェクトを用いてパラメータを伝達できることを知った.関数パラメータを収集するphpで使用する方法はfunc_ですget_args()は、jsではargumentsプロパティを使用して取得されます(このプロパティは配列に似ています).
pythonでは、どのようにして長くなるパラメータを取得しますか?
第一:リスト、辞書、メタグループの使用
たとえば
ここで、メタグループには可変性があるため、関数内でメタグループを変更するべきではありません.そうしないと、次のようにエラーが発生します.
第二:可変パラメータの使用
ここで、*argsはすべての位置に関連するパラメータを収集し、1つのメタグループに配置し、最後にこのメタグループをargsに割り当て、*kargsポインタはキーワードパラメータ(a=3のタイプを指す)に対して、これらのキーワードパラメータは対応する辞書に配置され、kargsに同様の値が与えられる.
これに対してpythonには解包パラメータもあります.以下のプログラムを参照
通常の呼び出しの場合、demo(1,2,3)のような3つのパラメータを伝達しなければなりませんが、パケット解除パラメータがあれば、1つのメタグループだけで実現できます.
*argはメタグループを解くことができますが、*argは辞書を解くことができます.以下のプログラムを参照してください.
注意収集パラメータとパラメータの解包形式は似ているので、違いに注意してください.収集関数は,パラメトリックパラメータでは*,**を用いてパラメータ解包を実現し,実パラメータでは*,**を用いて実現する.
以上の基礎を持ってmap()の実現をシミュレートします
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)
"""