Pythonを学ぶとき、常に2つの魔法の変数* argsと** kwargsに遭遇しますが、それらは何ですか?
まず第一に、それは書かれる必要はありません*args和**kwargs
。変数の前にある*(アスタリスク)のみが必要です。一般的な命名規則*var 和**vars
として記述することもでき*args 和**kwargs
ます。
次に、パラメータグループという名前もあります。これは、プリミティブ(非キーワードパラメータ)またはディクショナリ(キーワードパラメータ)を介してパラメータグループとして関数に渡されます。これらは、明示的に定義されたパラメータのない関数です。
1.*args
使用法
*args和**kwargs
主に関数定義に使用されます。関数に無制限の数のパラメーターを渡すことができます。
ここでの不確定な意味は次のとおりです。関数ユーザーが渡すパラメーターの数が事前にわからないため、このシナリオではこれら2つのキーワードを使用します。
*args
これは、キーと値のペアではない可変数のパラメーターリストを関数に送信するために使用されます。
簡単な例:
>>> def func1(*args):
... print(args)
...
>>> func1()
()
>>> func1('hao')
('hao',)
>>> func1('hao',123)
('hao',123)
この概念を理解するのに役立つ例を次に示します。
def test_args(arg1, *argv):
print("变量1:", arg1)
for arg in argv:
print("变量参数组参数为:", arg)
test_args('1', '2', '3', '4')
出力結果は次のとおりです。
変数1 :: 1
変数パラメーターグループのパラメーターは次のとおりです。2
変数パラメーターグループのパラメーターは次のとおりです。3
変数パラメーターグループのパラメーターは次のとおりです。4
2. ** kwargsの使用法
kwargsを使用すると、可変長のキーと値のペア(辞書)をパラメーターとして関数に渡すことができます。関数で名前付きパラメーターを処理する場合は、 kwargsを使用する必要があります。
簡単な例:
>>> def func2(**kwargs):
... print(kwargs)
...
>>> func2()
{
}
>>> func2(name='tom',age=20)
{
'name':'tom','age'=20}
def test_kwargs(**kwargs):
for key, value in kwargs.items():
print("{0} == {1}".format(key, value))
>>> test_kwargs(name="tom")
name == tom
これで、関数内のキーと値のペアのパラメーターをどのように処理するかがわかります。これが**kwargs
基本です。
次に、それ*args和**kwargs
を使用して、パラメーターがリストまたは辞書である関数を呼び出す方法について説明します。
3. * argsと** kwargsを使用して関数を呼び出します
それでは、これを使用し*args和**kwargs
て関数を呼び出す方法を見ていきます。
- 関数を呼び出すとき
*
は、シーケンスオブジェクトの前に追加して、シーケンスオブジェクトを分割します - 関数を呼び出すときは、辞書オブジェクトの前に追加し
**
て、辞書オブジェクトがkey = valの形式に分割されていることを示します。
簡単な例1:
単純な関数を定義する
>>>def get_age(name,age):
... print('%s is %s years old' %(name,age))
最初に使用する* args:
>>> user = ['tom',20]
>>> get_age(user[0],user[1])
tom is 20 years old
>>> get_age(*user)
tom is 20 years old
** kwargsを使用します:
>>> user_dict = ['name':'tom','age':20]
>>> get_age(name='tom',age=20)
tom is 20 years old
>>> get_age(**user_dict)
tom is 20 years old
例2:
次のような関数があるとします。
def test_args_kwargs(arg1, arg2, arg3):
print("arg1:", arg1)
print("arg2:", arg2)
print("arg3:", arg3)
* argsまたは** kwargsを使用して、この関数にパラメーターを渡すことができます。これを行う方法は次のとおりです。
最初に使用する* args:
>>> args = ("two", 3, 5)
>>> test_args_kwargs(*args)
arg1: two
arg2: 3
arg3: 5
** kwargsを使用します:
>>> kwargs = {
"arg3": 3, "arg2": "two", "arg1": 5}
>>> test_args_kwargs(**kwargs)
arg1: 5
arg2: two
arg3: 3
関数で標準パラメーター* argsと** kwargsを同時に使用する場合、順序は次のとおりです
。some_func(fargs、* args、** kwargs)
使用した4シーン
ニーズによって異なります。最も一般的な使用例は、関数デコレータを作成する場合です。
また、モンキーパッチにも使用できます。モンキーパッチとは、実行時に一部のコードを変更することを意味します。たとえば、APIを呼び出して対応するデータを返すget_infoという関数を持つクラスがあります。テストする場合は、API呼び出しをいくつかのテストデータに置き換えることができます。例えば:
import someclass
def get_info(self, *args):
return "Test data"
someclass.get_info = get_info