4

Python の関数定義で *args と **args の違いを理解しようとしています。以下の例では、 *args はタプルにパックして合計を計算するように機能します。

>>> def add(*l):
... sum = 0
... for i in l:
... sum+=i
... return sum ...
>>> add(1,2,3)
6
>>> l = [1,2,3]
>>>add(*l)
6

**引数の場合、

>>> def f(**args):
...     print(args)
... 
>>> f()
{}
>>> f(de="Germnan",en="English",fr="French")
{'fr': 'French', 'de': 'Germnan', 'en': 'English'}
>>> 

パラメータを取り、辞書に変わることがわかります。しかし、**引数を使用するときに役立つユーティリティやその他のことを理解していません。実際、私は *args と **args が何と呼ばれているか知りません (vararg と ?)

ありがとう

4

1 に答える 1

10

2 つのアスタリスクを使用する場合、通常は**kwargsキーワード引数として呼び出します。これらは、大規模なプログラムで関数から関数にパラメーターを渡すのに非常に役立ちます。

キーワード引数の良いところは、コードを簡単に変更できることです。cube以下の例で、パラメーターも関連していると判断したとしましょう。必要なのは に を追加することだけであり、 を呼び出しているすべての関数にパラメーターを追加する必要はありませんif statement(その関数が を持っている限り)。my_func_2my_func_2**kwargs

これは単純でばかげた例ですが、役に立てば幸いです。

def my_func_1(x, **kwargs):
    if kwargs.get('plus_3'):
        return my_func_2(x, **kwargs) + 3
    return my_func_2(x, **kwargs)

def my_func_2(x, **kwargs):
    #Imagine that the function did more work
    if kwargs.get('square'):
        return x ** 2
    # If you decided to add cube as a parameter 
    # you only need to change the code here:
    if kwargs.get('cube'):
        return x ** 3
    return x

デモ:

>>> my_func_1(5)
5
>>> my_func_1(5, square=True)
25
>>> my_func_1(5, plus_3=True, square=True)
28
>>> my_func_1(5, cube=True)
125
于 2013-09-12T00:55:40.307 に答える