Pythonプログラミング学習:関数をより柔軟にする* argsと** kwargs(パラメーターの数が異なる設計関数)の概要、それらの使用方法、および古典的なケースの詳細なガイド
目次
* argsと** kwargsの概要(異なる数のパラメーター関数の設計)
1. *使用法:クラスでバスケットボールを学ぶために登録したクラスメートを数えますが、名前がいくつあるかわかりません
2。**使用法:特定の人の趣味を数えますが、その人の趣味の数はわかりません
* argsおよび** kwargs関数定義の使用方法-パラメーターの数が異なる関数を設計する方法
T1、最も基本的なアプローチ-渡すパラメーターとしてリストを作成します(すべての値を列挙できる場合に適しています)
T2:* argsおよび** kwargs、可変数の位置パラメーターを渡す主な使用法
1. * argsの導入と使用法(名前のないパラメーターをいくつでも表すリスト/素数の祖先形式)
(2)上記の問題を解決する-パラメーターの数が異なる関数を設計する方法
2. ** kwargsの紹介と使用法(辞書の形式で、対応するキーワードパラメーターが1つずつあることを意味します)
(2)上記の問題を解決する-パラメーターの数が異なる関数を設計する方法
知識ポイントの拡張:関数内のパラメーターの順序-可変数の位置パラメーターと名前付きパラメーターを受け入れる方法は?
(1)デフォルトパラメータが機能パラメータに含まれていない場合
(2)関数パラメータにデフォルトパラメータが含まれている場合
(1)解凍演算子*を使用して、リスト出力コンテンツ自体に適用します-print()は最初にリストを解凍します
(3)解凍演算子*を使用して、リストを3つの異なる部分(最初の値、最後の値、およびその間のすべての値)に分割します
(4)解凍演算子*を使用して2つのリストリストをマージします-*を使用して反復可能なオブジェクト(リストと文字列)を解凍します
(6)unpack演算子を使用します** unpack辞書オブジェクト-** 2つのdict辞書をマージします
* argsと** kwargs(パラメーターの数が異なる設計関数)の概要
* argsと** kwargsは、 Pythonプログラミングの変数パラメーターの2つの形式です。これらの2つは変数を表し、可変長パラメーターを受け取ることができることを示します。知っておく必要があります
- argsとkwargsの名前は重要ではありません。これらは慣例により確立された命名規則であり、それぞれ「パラメータ」と「キーワードパラメータ」を表します。したがって、もちろん、* arや*などの他の適切なパラメータ名を使用できます。 * kw;
- 位置パラメータはキーワード引数の前にあるため、* argsは** kwargsの前に配置する必要があります。
* args | ** kwargs | |
一文説明 | パラメータをタプルにパックし、関数本体を呼び出します。 | 関数呼び出しの本体に指示するパラメーターパッケージのキーワード引数。 |
特徴 | 関数に渡される複数のパラメータは、関数の異なるパラメータの数のカウント、未知のパラメータの数を設定し、長ささえゼロにすることができます。* argsは** kwagsの前にある必要があります。そうでない場合、構文エラーが発生します。関数定義および関数呼び出し argsとkwargsの組み合わせは、任意の数のパラメーターを渡すことができます。これは、パラメーターが不明な場合に非常に効果的であると同時に、関数のスケーラビリティーを強化します。 |
|
名前が示すように | argsはargumentsの省略形であり、位置パラメーターを意味します。 | kwargsは、キーワード引数の略語であり、キーワード引数を意味します。 |
使用法 | 関数に渡すパラメーターの数がわからない場合、またはリストやタプルの形式でパラメーターを関数に渡したい場合は、* argsを使用する必要があります。 | 関数に渡すキーワードパラメーターの数がわからない場合、または辞書の値をキーワードパラメーターとして使用してパラメーターを関数に渡す場合は、** kwargsを使用する必要があります。 |
記憶 | argsには、タプルにパッケージ化されているキーが含まれていません | kwargsにはキー、つまりパッケージキーワードパラメータが含まれています |
def a_function(*args, **kwargs):
pass
1. *使用法:クラスでバスケットボールを学ぶために登録したクラスメートを数えますが、名前がいくつあるかわかりません
# 1、*用法:统计一个班内报名学篮球的同学,但是不知道有多少个人名
def CountLearnBasketballs(*basketNums):
print("People who study basketball have:" + ", ".join(basketNums))
# (1)、用在函数定义中
CountLearnBasketballs('马云','马化腾','李彦宏','刘强东','王兴','丁磊')
# (2)、用在函数调用中
basketNames = ('马云','马化腾','李彦宏','刘强东','王兴','丁磊')
CountLearnBasketballs(*basketNames)
2。**使用法:特定の人の趣味を数えますが、その人の趣味の数はわかりません
# 2、**用法:统计某个人的爱好,但是不知道这个人有多少种爱好
def CountHobbies(**hobbies):
print("This person's hobbies include...")
for category, fave in hobbies.items():
print(f"{category}: {fave}")
CountHobbies(sports='basketball', arts='drawing', learning='reading')
* argsおよび** kwargs関数定義の使用方法-パラメーターの数が異なる関数を設計する方法
T1、最も基本的なアプローチ-渡すパラメーターとしてリストを作成します(すべての値を列挙できる場合に適しています)
def SUMListsByLists(MoreParasLists):
sum_lists = 0
for a in MoreParasLists:
sum_lists += a
return sum_lists
MoreParasLists = [1, 2, 3, 4, 5, 6]
print(SUMListsByLists(MoreParasLists))
21
T2:* argsおよび** kwargs、可変数の位置パラメーターを渡す主な使用法
1. * argsの導入と使用法(名前のないパラメーターをいくつでも表すリスト/素数の祖先形式)
(1)* argsの紹介と使用法
* argsは、パラメーターをタプルにパックし、関数本体を呼び出すために使用されます。これらは非キーワード・パラメーターであり、タプルに使用されます。このとき、関数にリストを渡す代わりに、位置パラメーターを受け取ります。原則は、3つの異なる位置パラメーターを渡すことです。
- 上記のSUMListsByArgsは、すべての入力パラメーターを取得し、それらを単純な反復可能なオブジェクトにパックします。
- オブジェクトには、argsまたは他の名前args123という名前を付けることができます。主に、アンパック演算子である「*」記号を接頭辞として付けます。ただし、反復可能オブジェクトはリスト(変数)ではなく、タプル(不変)です。
def args01(*args):
print(args, type(args))
args01('一个处女座的程序猿')
def args02(x, y, *args):
print(x, y, args)
args02(1, 2, 3, 4, '我是','一个处女座的程序猿')
('一个处女座的程序猿',) <class 'tuple'>
1 2 (3, 4, '我是', '一个处女座的程序猿')
(2)上記の問題を解決する-パラメーターの数が異なる関数を設計する方法
def SUMListsByArgs(*args):
sum_lists = 0
# Iterating over the Python args tuple
for a in args:
sum_lists += a
return sum_lists
print(SUMListsByArgs(1, 2, 3, 4, 5, 6))
21
2. ** kwargsの紹介と使用法(辞書の形式で、対応するキーワードパラメーターが1つずつあることを意味します)
(1)** kwargsの紹介と使用法
** kwargsはパラメーターをパックし、キーワードパラメーターはdictの形式で関数本体に呼び出されます。実際、** kwargsは* argsと同様に機能しますが、位置パラメーターを受け取る代わりに、キーワード(キーワード)パラメーター(名前付きパラメーターとも呼ばれます)を受け取ります。同様に、オブジェクトにはkwargsまたは他の名前kwargs123という名前を付けることができ、主にアンパック演算子である「**」というプレフィックスが付けられます。ただし、反復可能なオブジェクトは辞書dictであるため、戻り値を取得するには.values()を使用する必要があります。
def kwargs01(**kwargs):
print( kwargs, type(kwargs))
kwargs01(a='一个处女座的程序猿')
def kwargs02(**kwargs):
print(kwargs)
kwargs02(a='我是', b='一个处女座的程序猿', c='!')
{'a': '一个处女座的程序猿'} <class 'dict'>
{'a': '我是', 'b': '一个处女座的程序猿', 'c': '!'}
(2)上記の問題を解決する-パラメーターの数が異なる関数を設計する方法
def StrConnect(**kwargs):
strs01='';strs02=''
# Iterating over the Python kwargs dictionary
for b in kwargs:
strs01 += b
for a in kwargs.values():
strs02 += a
print('keys集合:',strs01)
print('values集合:',strs02)
return strs02
print(StrConnect(a="大家好", b=",", c="我是", d="一个处女座的程序猿", e="!"))
keys集合: abcde
values集合: 大家好,我是一个处女座的程序猿!
大家好,我是一个处女座的程序猿!
知識ポイントの拡張:関数内のパラメーターの順序-可変数の位置パラメーターと名前付きパラメーターを受け入れる方法は?
1. arg、* args、** kwargsの混合使用の概要-argsとkwargsを組み合わせて任意の数のパラメーターを渡すことができます。これは、パラメーターが不明な場合に非常に効果的であると同時に、関数。
argsとkwargsの組み合わせは、任意の数のパラメーターを渡すことができます。これは、パラメーターが不明な場合に非常に効果的であると同時に、関数のスケーラビリティーを強化します。
- 順序は非常に重要です。デフォルト以外のパラメーターはデフォルトパラメーターの前に処理する必要があるため、* argsは** kwargsの前にあります。
- パラメータの正しい順序:位置パラメータ→* argsパラメータ→** kwargsパラメータ、デフォルト以外のパラメータ→デフォルトパラメータ。3つのパラメータarg、* args、** kwargsの位置は一定でなければなりません。
def VariableParasNum_Test(arg,*args,**kwargs):
print('VariableParasNum_Test')
print(arg,args,kwargs)
VariableParasNum_Test(1,2,3,4,a=5, b=6, c=7)
VariableParasNum_Test
1 (2, 3, 4) {'a': 5, 'b': 6, 'c': 7}
(1)デフォルトパラメータが機能パラメータに含まれていない場合
その中で
- xは1、yは2です。
- 3,4はargsに与えられます。つまり、args =(3,4);
- a = 5、b = 6、
- y = 7は辞書形式でkwargsに渡されます
def VariableParasNum_NoDefault_Test(x, y, *args,**kwargs):
print('VariableParasNum_NoDefault_Test')
print(x, y, args, kwargs)
VariableParasNum_NoDefault_Test(1,2,3,4,a=5,b=6,c=7)
VariableParasNum_NoDefault_Test
1 2 (3, 4) {'a': 5, 'b': 6, 'c': 7}
(2)関数パラメータにデフォルトパラメータが含まれている場合
位置パラメータ、デフォルトパラメータ、および* argsパラメータが同時にあります。正しい順序は次の2つの場合です。位置パラメータは、すべて一番上にあることに注意してください。
T1、(位置パラメータ→デフォルトパラメータ→*引数)
その中で
- xは1です
- y = 1の値は2に置き換えられます。
- 3,4,5はすべてargsに与えられます。つまり、args =(3,4,5)
def VariableParas_IncludeDefault_Test(x,y=1,*args):
print('VariableParas_IncludeDefault_Test')
print(x,y,args)
VariableParas_IncludeDefault_Test(1,2,3,4,5)
VariableParas_IncludeDefault_Test
1 2 (3, 4, 5)
T2、(位置パラメータ→*引数→デフォルトパラメータ)
その中で
- xは1です
- 2,3,4,5はargsに与えられます。つまり、args =(2,3,4,5)
- yは常に1です
def ArgsAndDefault_Test(x,*args,y=1):
print('ArgsAndDefault_Test')
print(x,args,y)
ArgsAndDefault_Test(1,2,3,4,5)
ArgsAndDefault_Test
1 (2, 3, 4, 5) 1
(3)位置パラメータ、デフォルトパラメータ、* args *、* kwargsパラメータが同時に含まれている場合:正しい順序は、位置パラメータ→* args *→デフォルトパラメータ→* kwargsです)
その中で
- xは1、yは2
- 3,4はargsに与えられます。つまり、args =(3,4)
- aとbはそれぞれ5と6に置き換えられます
- y = 7は辞書形式でkwargsに渡されます
def VariableParas_IncludeAll_Test(x, y, *args, a=8, b=9, **kwargs):
print('VariableParas_IncludeAll_Test')
print(x, y, args, a, b, kwargs)
VariableParas_IncludeAll_Test(1,2,3,4,a=5,b=6,c=7)
VariableParas_IncludeAll_Test
1 2 (3, 4) 5 6 {'c': 7}
2.解凍アスタリスク演算子-*および**を深く理解する
unpacking演算子は、Pythonで反復可能なオブジェクトの値を解凍する演算子です。
- *:Pythonが提供する反復可能なオブジェクトで使用できる単一のアスタリスク演算子。
- **:2つのアスタリスク演算子は、辞書でのみ使用できます。
(1)解凍演算子*を使用して、リスト出力コンテンツ自体に適用します-print()は最初にリストを解凍します
理解:print()は、入力としてリストではなく、入力として3つの異なるパラメーターを取りました。パッケージ演算子(*)は、関数定義ではなく、関数を呼び出すために使用されます。ここで、print()は、リスト内の1つの項目をパラメーターとして受け取ります。以下に示すように、出力はリスト自体ではなく、リストのコンテンツになります。
lists01 = [1, 2, 3, 4, 5, 6]
print(lists01)
print(*lists01)
[1, 2, 3, 4, 5, 6]
1 2 3 4 5 6
(2)複数の開梱演算子の使用方法*
*演算子を使用してリストを解凍し、個々のパラメーターを渡す場合と同じように、パラメーターとして関数に渡します。これは、複数のアンパック演算子を使用して、複数のリストから値を取得し、パラメーターとして関数を渡すことができることを意味します。
def SUMListsByArgs(*args):
res = 0
for x in args:
res += x
print(res)
return res
list01 = [1]
list02 = [2, 3]
list03 = [4, 5, 6]
SUMListsByArgs(*list01, *list02, *list03)
21
(3)解凍演算子*を使用して、リストを3つの異なる部分(最初の値、最後の値、およびその間のすべての値)に分割します
1つの変数がaに割り当てられ、最後の変数がcに割り当てられ、他の値がリストbにパックされます。
lists = [1, 2, 3, 4, 5, 6]
first, *middle, last = lists
print(first, middle, last)
1 [2, 3, 4, 5] 6
(4)解凍演算子*を使用して2つのリストリストをマージします-*を使用して反復可能なオブジェクト(リストと文字列)を解凍します
list01 = [1, 2, 3]
list02 = [4, 5, 6]
list03 = [*list01, *list02]
print(list03)
[1, 2, 3, 4, 5, 6]
(5)解凍演算子*を使用して文字列を解凍します。2つの方法
a = [*"一个处女座的程序猿"] # 直接解包
*b, = "一个处女座的程序猿" # *将字符串指定到一个新的list
print(a)
print(b)
['一', '个', '处', '女', '座', '的', '程', '序', '猿']
['一', '个', '处', '女', '座', '的', '程', '序', '猿']
(6)unpack演算子を使用します** unpack辞書オブジェクト-** 2つのdict辞書をマージします
dict01 = {'AI':1, 'ML':2, 'DL':3}
dict02 = {'CV':4, 'NLP':4, 'DS':4}
dict03 = {**dict01, **dict02}
print(dict03)
{'AI': 1, 'ML': 2, 'DL': 3, 'CV': 4, 'NLP': 4, 'DS': 4}
* argsおよび** kwargs関数呼び出しの使用法
* argsと** kwargsは、関数定義だけでなく、関数呼び出しでも使用できます。呼び出しで使用される場合、タプルのパックおよびアンパックと同様に、パック(パック)およびアンパック(アンパック)と同等です。
def unpackByargs(arg1, arg2, arg3):
print(arg1, arg2, arg3)
args = ("一个处女座的程序猿", 2021, 315)
unpackByargs(*args)
一个处女座的程序猿 2021 315