Function Parameters


Python Function Parameters


Pyhtonでは、関数はparameterを受け入れ、returnの値をoutに返します.
そして、関数が呼び出されると、parameterが関数に渡されて呼び出される(pass).
関数のparameterには様々な形式があり、まず、最も基本的な形式はparameterの値を順次伝達することである.これをPositional Argumentsと呼びます.

Positional arguments

def my_profile(name,age):            
	print(f"제 이름은 {name}이고, 나이는{age} 입니다.")
 my_profile("박세용", 27)
# 제 이름은 박세용이고, 나이는 27 입니다. 
このうちdefmy profile(name,age)カッコ内にはname, ageがパラメータとして使用される.
my profile(「朴世勇」,27)カッコ内には"박세용", 27個のarumenetがある.

Keyword Arguments


しかしながら、上記のように、parameterの値を順番に与えることは不可能である.parameterの名前で値を順番に渡すことはできません.
キーワードargumentsと呼ばれます.parameter値はkeyword arguments方式で伝達され、実際のパラメータ順序は変更可能である.
def my_profile(name,age):            
	print(f"제 이름은 {name}이고, 나이는{age} 입니다.")
my_profile(age = 27, name = "박세용")
# 제 이름은 박세용이고, 나이는 27 입니다. 
Keyword Argumentsの使用

  • 順番が変わっても大丈夫で、読みやすさも向上します.
  • parameterの順序で関数に値を渡すと、うっかり値を変更してもわかりにくいです.

  • これに対して、Keyword Argumentsはparameterの名前に合わせて値を関数に渡し、誤って値を変更する確率は比較的小さい.

  • また,コードを読む人もどの値をひっくり返すかをはっきり知ることができるので,可読性が向上する.
  • Mixing positional arguments and keyword arguments


    Mixing position argumentsとkeyword argumentsparameter値の位置パラメータと
    混合使用位置パラメータです.
    次の例です.
    def my_profile(name,age):            
    	print(f"제 이름은 {name}이고, 나이는{age} 입니다.")
    my_profile("박세용", age = 27)
    # 제 이름은 박세용이고, 나이는 27 입니다. 
    このように使えますが、ここで注意したいのは、キーワードargumentsは順番が変わっても構いませんが、位置arguments部分は順番を守らなければなりません.
    たとえば、次のコードのように関数を呼び出すと、errorが生成されます.
    def my_profile(name,age):            
    	print(f"제 이름은 {name}이고, 나이는{age} 입니다.")
    my_profile(age = 27, "박세용")
    > Traceback (most recent call last): File "python", line 1 SyntaxError: positional argument follows keyword argumentエラーの原因は、キーワードパラメータ(age = 27)が位置パラメータ("박세용")よりも前であるため、関数が呼び出される.Positional argumentsは順序を守らなければならないが、順序が間違っているので、間違いが発生する.

    Parameter Default Value


    関数のparameterに対してdefault値を定義できます.Defaultの値を定義したparamterは、関数呼び出し時に値を超える必要はありません.値を超えていない場合、default値は自動的に値を超えます.
    def my_profile(name,age=27):            
    	print(f"제 이름은 {name}이고, 나이는{age} 입니다.")
    my_profile("박세용")
    # 제 이름은 박세용이고, 나이는 27 입니다. 
    
    함수를 호출 할 때 2번쨰 parameter 값을 정의하지 않았으나 default 값이 정의 되어 있음으로 default 값이 자동으로 사용된다.
    default 값 -> age = 27
    ただし、default値を定義したパラメータは、default値を定義していないパラメータよりも先ではないことに注意してください.non-default valueparameterの前にdefault valueparameterを宣言すると、次の例に示すsyntax errorが表示されます.
    def my_profile(name = "박세용", age):            
    	print(f"제 이름은 {name}이고, 나이는{age} 입니다.")
    my_profile(27") 
    > Traceback (most recent call last): File "python", line 1 SyntaxError: non-default argument follows default argument上記の内容を学習する過程で、突然関数を定義する際にnon-defultvalueparameterの前でdefaultを定義できない原因に疑問が生じ、原因を深く理解したい.

    なぜ関数を定義するときにdefault valueparameterをnon-deffault valueparameterの前に定義できないのですか?



    まず、parameterの全体的な順序を上図から見ることができる.
    上の図を見て、自分で説明すると、
    1. positional arguments들을 받는 parameter
    2. default value를 갖지만 positional arguments를 받는 parameter
    3. variable length positional arguments(가변 인수,*args)의 parameter 
    4. keyword arguments를 받는 parameter들 중, non-default value 그리고 default value
    5. variable length keyword arguments(가변 키워드 인수,**kwargs)
    次の順序で表示されます.
    これらの順序を守らないと、文法の間違いが発生します.
    定義されたパラメータの順序に従って作成しないと、関数がどのパラメータに値を取るべきかが混同されます.
    pyhtonは、関数を定義または呼び出したときにパラメータが正しく呼び出されるかどうかを評価し、決定します.
    したがって,パラメータ(argumenet)に位置パラメータを順次割り当て,後でキーワードパラメータを割り当てる.
    上記の例をもう一度見てみましょう.
    def my_profile(name = "박세용", age):            
    	print(f"제 이름은 {name}이고, 나이는 {age} 입니다.")
    my_profile(27) 
    呼び出された関数my profile(「27」)は、関数の最初のパラメータname=「朴世勇」に入ってから正常に呼び出されなければならないが、パラメータname=「朴世勇」はすでに「朴世勇」というパラメータ値を受け入れているため、文法エラーが発生した.
    また,27という因数がどのパラメータを指定しているのか分からないので,明示的に割り当てる必要がある.
    エラーを解決するために、以下の順序で変更できます.
    def my_profile(age, name = "박세용"):            
    	print(f"제 이름은 {name}이고, 나이는 {age} 입니다.")
    my_profile(27) 
    # 제 이름은 박세용이고, 나이는 27입니다.

    位置パラメータと可変長パラメータの位置


    まず位置因数と可変因数が何であるかを簡単に理解します.
  • 位置引数(位置パラメータ):関数に引数を順番に入れる
    位置パラメータの例
  • def my_profile(name,age):
    	print(f"이름 : {name}, 나이: {age}")
    
     my_profile("박세용", 27)
    # 이름 : 박세용, 나이 : 27
  • 可変パラメータ(変長パラメータ):パラメータの数が不確定
    可変パラメータの例
  • def my_profile(*args):
    	for i in args:
        	print(i)
    
    my_profile("박세용", "나이 : 27","주소 : 경기도")
    #  박세용
    #  나이 : 27
    #  주소 : 경기도
    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)
    上の関数を実行するとエラーが発生します.Traceback (most recent call last): File "<pyshell#20>", line 1, in <module> func_param_with_var_args("정우성", "01012341234", "seoul", 20) TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'エラーが発生した原因はparameterの順序です.
    位置パラメータは先に来るべきで、それから変数lengthパラメータです.
    エラーを解決するには、コード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("정우성", "01012341234", "seoul", 20)
    # name=정우성
    # args=('seoul', 20)
    # age=01012341234
    前に示したように、エラーが解決されたことがわかります.

    可変キーワードパラメータ(variablelengthキーワードarguments)

  • 可変キーワードパラメータ(可変長キーワードパラメータ)=*kwargs
  • *kwargsは、키워드 = 값形式で関数を呼び出し、dict形式'key' : 'value' で関数内部に渡される.
  • 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")
    
    # 오류 발생 -> `SyntaxError: invalid syntax`
    上記の関数定義には、可変キーワードパラメータが含まれています.
    ご覧のように、可変キーワード引数は中央にあり、関数定義自体にはなりません.
    nameはRegulal Positional Argumentsで、
    年齢Regular Positional Arguments
    **kwargsはVariable Length Keyword Argumentsで、
    addressはeyword-Only Arguments With Defaulsです.
    したがって、variable length keyword argumentsKeyword-Only Arguments With Defaulsより前にあるため、エラーが発生します.
    上記のエラーを解決するために、最後に可変キーワードパラメータを送信する必要があります.
    def func_param_with_kwargs(name, age, address=0, **kwargs):
        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")
    # name=정우성
    # age=20
    # kwargs={'mobile': '01012341234'}
    # address=seoul

    位置パラメータとキーワード可変キーワードパラメータ(variablelengthキーワードパラメータ)


    前の2つの例では、位置パラメータ、可変パラメータ、および可変キーワードを一度に定義します.
    変数係数、変数キーワード係数は後ろに置くべきだと合理的に推測できる.
    パラメータの優先度を再整理します.
    位置パラメータ->可変パラメータ->可変キーワードパラメータの順に配置します.
    次に例を見てみましょう.
    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")
    
    # 오류 발생 : `SyntaxError: invalid syntax`
    関数を定義できないエラーが発生しました.
    まず、これらのパラメータが何であるかを見てみましょう.
    年齢Regular Positional Arguments
    name="IU"はDefault Argumentsで、
    *argsはVariable Length Positional Argumentsで、
    addressはNon-Default Keyword-Only Arguments**kwargsはVariable Length Keyword Argumentsで、
    そうです.
    正常に出力するために、上記のいくつかのエラーを解決した例を考慮して、各パラメータの位置を優先度別に変更してみました.
    def mixed_params(age, name="아이유", *args, address, **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, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
    
    # name=정우성
    # args=('01012341234', 'male')
    # age=20
    # kwargs={'mobile': '01012341234'}
    # address=seoul
    パラメータの順序age -> name="아이유" -> *args -> address -> **kwargsに代わる
    正常な出力を確認できます.
    .Reference
    https://velog.io/@wind1992/%EA%B0%80%EB%B3%80%EC%9D%B8%EC%88%98%EC%99%80-%EA%B0%80%EB%B3%80%ED%82%A4%EC%9B%8C%EB%93%9C-%EC%9D%B8%EC%88%98
    https://wikidocs.net/84426
    https://opentutorials.org/module/4811/28493
    https://devpouch.tistory.com/82