Variable-length Arguments with *args and **kwargs in Python


Variable-length Arguments with *args and **kwargs


違う単語です.中学生の頃、英語の単語家で会ったことがあるようです.多様と書いてありますか...脈絡によれば、完全に「変化」と解釈できる.長さがあまり違わないので,変数に変数(変の数)の意味を与えるのは自然である.
variable-length argumentsを意訳する場合は、「パラメータの個数は不確定で変化するパラメータ」です.(実は、論点をパラメータと呼ぶか、違和感があるように見えますが、漢字ですか...argとして書きましょう)
名前の通り、関数が受信したargの個数がまだ確定していない場合、または知らない場合、関数が受信したargの個数が変化する.
argsには、argの位置に応じて処理されるpositionとargName=で処理されるnamed(キーワード)の2種類があります.2つの関数が宣言されたときにargs個数を不確定にし、関数を呼び出すときに複数を入力する方法があります.

*args


まず、position variable-length argsを見てみましょう.Pythonでは*argsと表示されます.
次の最高値の関数を探してみましょう.
def min_finder(num1, num2):

    result = num1
    if num2 < result:
    	result = num2
        
    return result
argの個数が2の場合、最大値の関数を探します.
3つ以上のargを受け取ったとき、最高値を探したら?
リストを利用してみましょう
def min_finder(nums):

    result = nums[0]
    for num in nums:
    	if num < result:
        	result = num
    
    return result

min_finder([3, 4, 5, 6, 2])
# output 2
これによりargsを2つ以上入れることができますが、毎回listに数字を入れます.数量が10個未満の場合は可能ですが、超えると面倒です.もう一つの問題は、リストに入れる数字が確定していなかったらどうすればいいのでしょうか.この場合*argsを使用できます.
def min_finder(*args):

    result = nums[0]
    for num in nums:
        if num < result:
        	result = num
    
    return result
    
min_finder(1,2,3,4,5,6,7,8,0)
# output 0
いくつか注意が必要です.まず、argsではなく*numsを使用できます.*後ろは勝手に書くことができますが、argsで書くのに慣れています.これは,他の人から見れば,位置変数−length argsを用いることを明確にするためである.
もう1つの重要な点は、*argsの後ろで位置argを使用できないことです.使用する必要があります.named-args(e.g.nameOfArg=age).(そうでなければエラー)
関数呼び出し時にkeyword argが表示された場合、positical argは現在パラメータに含まれていないと考えられます.
最後に、*argsの要素にアクセスするとlistのようにアクセスします.実際、*argsは関数scopeでtupleです.
def type_of_varLenArgs(*args):
	print(type(args))

type_of_varLenArgs(1,2):
# output <class 'tuple'>
*argsを接尾辞argsとして扱う場合、複数のargsを使用するか、未確定の場合に使用します.では、同じ場合、キーワードargsにも同じ処理方法があるのではないでしょうか.もちろん、Pythonでは**幅で表示されます.

複数のNamed Argumentsと**argsを同時に使用


まず、**argsのtypeから始めましょう.
def type_of_kwargs(**kwargs):
	print(kwargs)
    
type_of_kwargs(first="Sam", last="Lee")
# output {"first": "Sam", "last": "Lee"}
**argsはdictionary形式です!
あるブログのpostデータを受け入れる関数を考えてみましょう.
def save_blog_data(author, content, tags=[], categories=[]):

    pass
blog postの作者や内容は常にありますが、tagsやcategoriesのデータがない場合もあります.**kwargsで刺しましょう
def save_blog_data(author, content, **kwargs):

    if kwargs.get('tags'):
    # 포스트 tags 데이터가 있다면 저장
        pass
    
    if kwargs.get('categories'):
    # 포스트 catagories 데이터가 있다면 저장
    	pass
positionとnamed argsのvariable-lengthの状況を理解しました.合わせて利用しましょう.

Combine Both

def combined_varArgs(*args, **kwargs):

    print(args)
    print(kwargs)
    
combined_varArgs(3,2,1, name="Sam")

# output
(3, 2, 1)
{'name': 'Sam'}
位置argsとnamed argsを併用する場合、位置argsはnamed argsより先に使用する必要があります.また、固定長のargsとvariable-length argsを併用する場合、固定長のargsはまず現れなければならない.したがって、関数のargsを入れると、次のルールが作成されます.
  • 既知位置args
  • *args
  • 既知keword args
  • **args
  • かき混ぜてみよう
    def combined_all (num1, num2, *args, author="Sam", **kwargs):
    
    	if kwargs.get(...):
       		...
        
        pass

    単純テスト


    以上の理解に基づいて,以下の簡単な問題を解く.
    1.関数を定義するときにdefault valueparameterをnon-default valueparameterの前に定義するとエラーの原因になります
    default valueを持つパラメータを前に表示できるようにすると、関数を呼び出すときにどのargにdefault valueを適用するかが混乱します.argsが多くなり、上書きされるなど混同されることが多い.
    def fullName(first="Sam", last):
    	print('Lee')
        
        # 내가 원하는 값은 Sam Lee 이지만 first 에 
        # Lee 가 덮어씌워져서 first='Lee' 가 되고 last 값은 indefinite 됨
     
    def fullName(first, last="Lee"):
    	print("Sam")
        
        # Much Better!
    2.エラーを修正して次の関数を呼び出す
    def func_param_with_kwargs(name, age, **kwargs, address=0):
        print("name=",end=""), print(name)
        print("age=",end=""), print(age)
        print("kwargs=",end=""), print(kwargs)
        print("address=",end=""), print(address)
    
    func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")
    
    # Fix! 알고있는 keyword agr 가 **kwargs 보다 뒤에 쓰였다. 앞으로 바꿔주자.
    
    def func_param_with_kwargs(name, age, address=0, **kwargs):
    
    	print("name=",end=""), print(name)
        print("age=",end=""), print(age)
        print("address=",end=""), print(address)
        print("kwargs=",end=""), print(kwargs)
    
    func_param_with_kwargs("정우성", "20", address="seoul", mobile="01012341234")
    # output 
    name= 정우성
    age= 20
    address= seoul
    {'mobile': '01012341234}
    3.エラーを修正して次の関数を呼び出す
    def func_param_with_var_args(name, *args, age):
    
        print("name=",end=""), print(name)
        print("args=",end=""), print(args)
        print("age=",end=""), print(age)
    
    func_param_with_var_args("정우성", "01012341234", "seoul", 20)
    
    # 알고있는 positional arg 인 age 가 *args 보다 뒤에 쓰였다. 
    # 앞으로 옮겨주자
    
    def func_param_with_var_args(name, age, *args):
        print("name=",end=""), print(name)
        print("args=",end=""), print(args)
        print("age=",end=""), print(age)
    
    func_param_with_var_args("정우성", 20, "seoul", "01012341234")
    # output
    name= 정우성
    args= ('seoul', '01012341234')
    age= 20
    4.エラーを修正して、次の関数を呼び出します.
    def mixed_params(name="아이유", *args, age, **kwargs, address):
    
        print("name=",end=""), print(name)
        print("args=",end=""), print(args)
        print("age=",end=""), print(age)
        print("kwargs=",end=""), print(kwargs)
        print("address=",end=""), print(address)
    
    mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
    
    # args 순서를 규칙대로 바꿔주자
    # 두 가지 경우가 있다. 1) name을 알려진 keyword arg 로 쓸건지,
    # 아니면 2) positional arg로 쓰면서 name 의 default value 로 
    # "아이유" 를 쓸건지
    
    1)
    def mixed_params(age, address, *args, name="아이유", **kwargs):
    
        print("name=",end=""), print(name)
        print("args=",end=""), print(args)
        print("age=",end=""), print(age)
        print("kwargs=",end=""), print(kwargs)
        print("address=",end=""), print(address)
    
    # address 는 positional 이므로 함수를 
    # 호출할 때 keyword 형태로 쓰면 error 가 난다. 주의해야한다.
    
    mixed_params(20, "seoul", "정우성", "01012341234", "male", mobile="01012341234")
    # output
    name= 아이유
    args= ('정우성', '01012341234, 'male')
    age= '20'
    kwargs= {'mobile': '01012341234'}
    address= seoul
    
    2)
    def mixed_params(age, address, name="아이유" *args, **kwargs):
    
        print("name=",end=""), print(name)
        print("args=",end=""), print(args)
        print("age=",end=""), print(age)
        print("kwargs=",end=""), print(kwargs)
        print("address=",end=""), print(address)
    
    mixed_params(20, "seoul", "정우성", "01012341234", "male", mobile="01012341234")
    # output
    name= 정우성, # default 값인 '아이유' 에 '정우성' 이 덮어 씌어짐
    args= ('01012341234', 'male')
    age= 20
    kwargs= {'mobile': '01012341234'}
    address= seoul