1. ホーム
  2. python

[解決済み] 関数呼び出しにおけるstarとdoublestarの演算子の意味は?

2022-03-14 11:20:57

質問内容

とは何ですか? * 演算子の意味は、Pythonでは次のようなコードになります。 zip(*x) または f(**k) ?

  1. インタープリター内部ではどのように処理されているのでしょうか?
  2. 性能に全く影響を与えませんか?速いですか、遅いですか?
  3. どのような場合に有効で、どのような場合に無効なのか?
  4. 関数の宣言と呼び出しのどちらで使用すべきですか?

どのように解決するのですか?

シングルスター * は、シーケンス/コレクションを位置引数に展開するので、こんなことができます。

def sum(a, b):
    return a + b

values = (1, 2)

s = sum(*values)

これはタプルを解凍し、実際に次のように実行されるようにします。

s = sum(1, 2)

二重星 ** も同じように、辞書と名前付き引数を使うだけです。

values = { 'a': 1, 'b': 2 }
s = sum(**values)

組み合わせることもできます。

def sum(a, b, c, d):
    return a + b + c + d

values1 = (1, 2)
values2 = { 'c': 10, 'd': 15 }
s = sum(*values1, **values2)

として実行されます。

s = sum(1, 2, c=10, d=15)

セクションも参照してください。 4.7.4 - 引数リストのアンパッキング Pythonのドキュメントの


さらに *x**y これにより、関数が宣言で指定されていない任意の数の位置引数や名前付き引数を受け取ることができるようになります。

def sum(*values):
    s = 0
    for v in values:
        s = s + v
    return s

s = sum(1, 2, 3, 4, 5)

または ** :

def get_a(**values):
    return values['a']

s = get_a(a=1, b=2)      # returns 1

を使用すると、オプションのパラメータを宣言することなく大量に指定することができます。

そしてまた、組み合わせることができる。

def sum(*values, **options):
    s = 0
    for i in values:
        s = s + i
    if "neg" in options:
        if options["neg"]:
            s = -s
    return s

s = sum(1, 2, 3, 4, 5)            # returns 15
s = sum(1, 2, 3, 4, 5, neg=True)  # returns -15
s = sum(1, 2, 3, 4, 5, neg=False) # returns 15