関数呼び出しにおける**(二重星/アスタリスク)と*(星/アスタリスク)はどういう意味ですか?質問する

関数呼び出しにおける**(二重星/アスタリスク)と*(星/アスタリスク)はどういう意味ですか?質問する

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

おすすめ記事