これらの関数定義の と はどういう意味*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 で標準になります。