zip(*x)
または のようなコードではf(**k)
、*
と は**
それぞれ何を意味しますか? Python はその動作をどのように実装し、パフォーマンスにはどのような影響がありますか?
参照:タプルを引数に展開する*
質問者が議論に を使用する必要があるが、その存在を知らない場合に質問を閉じるには、これを使用してください。同様に、Python dict を kwargs に変換しますか?を使用する場合**
。
見る** (二重星/アスタリスク) と * (星/アスタリスク) はパラメータに対してどのような働きをしますか?パラメータに関する補足的な質問について。
ベストアンサー1
単一のスターは、*
シーケンスまたはコレクションを位置引数に展開します。
def add(a, b):
return a + b
values = (1, 2)
アンパック演算子を使用すると*
、 と書くことができs = add(*values)
、これは と書くことと同等になりますs = add(1, 2)
。
二重星は**
辞書に対しても同じことを行い、名前付き引数に値を提供します。
values = { 'a': 1, 'b': 2 }
s = add(**values) # equivalent to add(a=1, b=2)
両方の演算子は同じ関数呼び出しに使用できます。たとえば、次のようになります。
def sum(a, b, c, d):
return a + b + c + d
values1 = (1, 2)
values2 = { 'c': 10, 'd': 15 }
はs = add(*values1, **values2)
と同等ですs = sum(1, 2, c=10, d=15)
。
以下も参照関連セクションPython ドキュメントのチュートリアルの。
同様に、*
と を**
パラメータに使用できます。 を使用すると、*
関数は任意の数の位置引数を受け入れることができ、それらは 1 つのパラメータにまとめられます。
def add(*values):
s = 0
for v in values:
s = s + v
return s
ここで、関数が のように呼び出されるとs = add(1, 2, 3, 4, 5)
、values
はタプルになります(1, 2, 3, 4, 5)
(もちろん、結果は になります15
)。
同様に、 でマークされたパラメータは**
を受け取りますdict
:
def get_a(**values):
return values['a']
s = get_a(a=1, b=2) # returns 1
これにより、宣言せずに多数のオプション パラメータを指定できるようになります。
繰り返しますが、両方を組み合わせることもできます。
def add(*values, **options):
s = 0
for i in values:
s = s + i
if "neg" in options:
if options["neg"]:
s = -s
return s
s = add(1, 2, 3, 4, 5) # returns 15
s = add(1, 2, 3, 4, 5, neg=True) # returns -15
s = add(1, 2, 3, 4, 5, neg=False) # returns 15