** (二重星/アスタリスク) と * (星/アスタリスク) はパラメータに何をもたらしますか? 質問する

** (二重星/アスタリスク) と * (星/アスタリスク) はパラメータに何をもたらしますか? 質問する

これらの関数定義の と はどういう意味*argsですか?**kwargs

def foo(x, y, *args):
    pass

def bar(x, y, **kwargs):
    pass

見る関数呼び出しにおける ** (二重星/アスタリスク) と * (星/アスタリスク) はどういう意味ですか?議論についての補足的な質問に対して。

ベストアンサー1

*argsは、**kwargs関数に任意の数の引数を与えるための一般的な慣用句であり、セクション関数の定義についてさらに詳しくPython チュートリアルで。

は、*argsすべての位置引数を提供しますタプルとして:

def foo(*args):
    for a in args:
        print(a)        

foo(1)
# 1

foo(1, 2, 3)
# 1
# 2
# 3

**kwargsすべてのキーワード引数を辞書として提供します:

def bar(**kwargs):
    for a in kwargs:
        print(a, kwargs[a])  

bar(name='one', age=27)
# name one
# age 27

両方の慣用句を通常の引数と組み合わせることで、固定引数といくつかの可変引数のセットを許可できます。

def foo(kind, *args, bar=None, **kwargs):
    print(kind, args, bar, kwargs)

foo(123, 'a', 'b', apple='red')
# 123 ('a', 'b') None {'apple': 'red'}

これを逆に使用することも可能です。

def foo(a, b, c):
    print(a, b, c)

obj = {'b':10, 'c':'lee'}

foo(100, **obj)
# 100 10 lee

この慣用句の別の使用法は、関数を呼び出すときに引数リストを展開する*lことです。

def foo(bar, lee):
    print(bar, lee)

baz = [1, 2]

foo(*baz)
# 1 2

Python 3では*l代入式の左側で(拡張反復可能アンパック) ですが、このコンテキストではタプルではなくリストが返されます。

first, *rest = [1, 2, 3, 4]
# first = 1
# rest = [2, 3, 4]

また、Python 3では新しいセマンティクスが追加されました(参照ペップ3102):

def func(arg1, arg2, arg3, *, kwarg1, kwarg2):
    pass

このような関数は 3 つの位置引数のみを受け入れ、それ以降のすべては*キーワード引数としてのみ渡すことができます。

注記:

キーワード引数の受け渡しに意味的に使用されるPython はdict、任意の順序で並べられます。ただし、Python 3.6 以降では、キーワード引数は挿入順序を記憶することが保証されています。「 の要素の順序は、**kwargsキーワード引数が関数に渡された順序に対応するようになりました。」 -Python 3.6 の新機能実際、CPython 3.6 のすべての辞書は挿入順序を実装の詳細として記憶し、これは Python 3.7 で標準になります。

おすすめ記事