#27 Python-Functionの複数の可変パラメータ


ブログ課題を通していくつかの問題のエラー原因を理解し,これらの問題を修復し呼び出した.

I.可変パラメータ/可変キーワードパラメータ


1.可変パラメータ


可変パラメータ=variablelength arguments
表現=*args(重要なのは*です.*後に他の言葉を書くことができます.)
ユーザーに任意の複数の数値を入力するためのパラメータ
-->複数のパラメータが受信されている場合は、関数内で調整されたものとみなされます.

2.可変キーワード引数


可変キーワード引数=variablelengthキーワードarguments
表示=*kwargs(重要なのは2つの**です)
キーワードからなる任意の複数の数の因子を受け入れます.

I. default / non-default value


default value=関数の指定時に値を指定するパラメータ

1. Why? non-default > default


先に記述したTIL#34−2により、default値の前にnon−defult値を指定するとエラーが発生すると判定される.
コードを再確認します.
def love_you(my_name='딸', your_name):
  print(f'{my_name} loves {your_name}')
love_you('엄마')
->
  File "main.py", line 1
    def love_you(my_name='딸', your_name):
                 ^
SyntaxError: non-default argument follows default argument

原因を特定中...1


上記のコードで記述すると、パラメータ値your nameもmy nameのdefalult valueとみなされますか?そこで、次のコードを作成してみました.
def love_you(your_name, my_name='딸', '아들'):
  print(f'{my_name} loves {your_name}')
love_you('엄마')

->
  File "main.py", line 1
    def love_you(your_name, my_name='딸', '아들'):
                                         ^
SyntaxError: invalid syntax
心の中では「娘、息子は母を愛している」と出力すると思っています.(英語法の破壊を無視)

原因を特定中...2


目で確認することはできませんが、「関数を呼び出すときに入力した値は、前から順に指定関数のパラメータに入ります.最初の相対的なパラメータには指定したdefault valueがあるので、人為的な不調和が発生しますか?」考えてみる.
それを確認するには...私はグーグルで私のような人がどれだけいるか試してみるべきだと思います.

Googling : Stackoverflow

All required parameters must be placed before any default arguments. Simply because they are mandatory, whereas default arguments are not. Syntactically, it would be impossible for the interpreter to decide which values match which arguments if mixed modes were allowed.そうですか.
non-default valueは値を受け入れる必要がありますが、指定した値のdefault valueは違います.また、このような場合、どのような価値とどのような論点が合致する潮流の中で、このような必要な状況を妨げることはできません!
に表示されます.
私の考えは正しいようです.認識が調和していない状況は許されない!

2.パラメータ数!=論点の数?


コードを直接書いて理解しましょう.

1)non-defult/1個default+1個パラメータ2個

def love_you(your_name, how, my_name='딸'):
  print(f'{my_name} loves {your_name} {how}')
love_you('엄마')

->
Traceback (most recent call last):
  File "main.py", line 3, in <module>
    love_you('엄마')
TypeError: love_you() missing 1 required positional argument: 'how'
どのような論争もないという.

2)2個non-default/1個default+3個パラメータ

def love_you(your_name, how, my_name='딸'):
  print(f'{my_name} loves {your_name} {how}')
love_you('엄마', '아빠', '진짜로!')

->
진짜로! loves 엄마 아빠
これを見たら.
  • 論点が順次指定される.(default my nameへ)your_name = 엄마 how = 아빠 my_name = 진짜로!
  • 新しく指定した値で出力します.
  • 3)結論


    すなわち、パラメータの個数がdefault valueとして指定された回数を超えると、default valueを再指定することができる.

    II. 質問1:位置パラメータと可変パラメータ


    位置パラメータ=位置パラメータ
    可変パラメータ=variablelength arguments
    可変パラメータ.
    可変パラメータは任意の数のパラメータを表します.

    1.問題が発生


    1)問題コード

    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)

    2)問題出力結果

    Traceback (most recent call last):
      File "main.py", line 6, in <module>
        func_param_with_var_args("정우성", "01012341234", "seoul", 20)
    TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
    関数は、キーワードが1つしか許可されていないパラメータのvalueを逃しました.

    2.問題発見


    1)原因を知る(と思う)


    可変パラメータは個数可変のパラメータです.したがって,この因子は2個でも3個でもよい.
    そのためプログラムは自分でこのような可変な状況を把握するのは難しい!

    2)ソリューションの策定


    この場合、私と番組の間のデフォルトルールを制定しなければならない.
    したがって,位置因数と変数因数を併用する場合,常に最後に変数因数を入力すると考えられる.

    3.ソリューションの適用


    1)アプリケーションコード

    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, "01012341234", "seoul")

    2)出力結果

    name=정우성
    args=('01012341234', 'seoul')
    age=20

    4.問題の整理


    関数を指定する場合は、可変パラメータを位置パラメータの後に配置します.
    +)可変パラメータ(variablelengthパラメータ)を位置パラメータと見なすと、関数を呼び出す順序が理解できます.

    III.問題2:可変キーワード引数の位置


    可変キーワード引数=variablelengthキーワードarguments
    可変キーワードパラメータ?
    任意の数のキーワードパラメータを受信

    1.問題が発生


    1)問題コード

    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")

    2)問題出力結果

      File "main.py", line 1
        def func_param_with_kwargs(name, age, **kwargs, address=0):
                                                        ^
    SyntaxError: invalid syntax
    無効な文法だと言います.
    構文
    プログラミング言語におけるプログラムの外観、形状、構造を定義します.

    2.問題発見


    1)原因を知る(と思う)


    上の問題と同じように見えます.これは、可変キーワードファクタが一番後ろに並んでいないための問題かもしれません.上記の問題から、可変パラメータが位置係数の後にあるべきであることが分かる場合、この問題では、可変キーワード係数はキーワード係数の後ろにあるべきである.

    2)ソリューションの提案


    上記の問題で使用する方法のように、キーワード引数と可変キーワード引数の位置を変更します.

    3.ソリューションの適用


    1)アプリケーションコード

    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")

    2)出力結果

    name=정우성
    age=20
    kwargs={'mobile': '01012341234'}
    address=seoul

    4.問題の整理


    関数を指定する場合は、変数パラメータが常に一番後ろにある必要があります.

    5.詳細

  • キーパラメータを使用して関数を指定する場合、デフォルト値(関数を指定するときにaddress=0にスケール)が指定されている場合でも、関数を呼び出すときにdefault値に対応するパラメータをキーパラメータとして指定すると、新しく指定した値が出力されます.はい.(address=「seoul」と呼び、結果はseoulに出力されます.)
  • 関数を呼び出すと、パラメータの優先度はposition>keyword、position>variablelengthです.
  • 関数を呼び出す場合、パラメータの優先度はキーワードとvariablelengthキーワードが等しい
  • である.

    3)キーワードとvariablelengthキーワードの位置


    以下の例で理解できる.

    #1 keyword variablelength keywordパラメータの前にある

    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", address="seoul", mobile="01012341234", hi="hello")

    #2 variablelengthキーワードはキーワードパラメータの前にあります

    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", hi="hello", address="seoul")

    以上の2種類の出力結果

    name=정우성
    age=20
    kwargs={'mobile': '01012341234', 'hi': 'hello'}
    address=seoul

    IV.問題3:位置引数と可変キーワード引数


    1.問題が発生


    1)問題コード

    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")

    1)問題出力結果

      File "main.py", line 1
        def mixed_params(name="아이유", *args, age, **kwargs, address):
                                                           ^
    SyntaxError: invalid syntax
    無効な構文が表示されました.

    2.問題発見


    1)原因を知る(と思う)


    これは上記の問題と同じ形式の誤りである.上記の問題は、関数を指定するときに誤ったパラメータ値が入力されたためです.もしそうであれば,この問題も関数を指定する際に用いられるdefault/variablelength/non-defaultからなるparameterやposition/keyword/variablelength(キーワード)パラメータ間の順序によるものと推定できる.
    問題が長い

    2)ソリューションの策定


    これは…です.一つずつ順番を決めるしかない.これは困難な旅になるだろう.
    身につけた知識に基づいて、一歩一歩変えて、出力を続けます.

    No.1 default値はnon-defaultの後にある必要があります。


    ->同じエラーが発生

    No.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, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
    
    ->
    Traceback (most recent call last):
      File "main.py", line 8, in <module>
        mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
    TypeError: mixed_params() got multiple values for argument 'address'
    addressは値が多すぎるそうです.「鄭雨盛」「01012341234」「男性」が指定されているようです.

    no3. そうであれば、指定されていない複数の値を持つ可変長パラメータの位置を調整します。

    def mixed_params(age, *args, address, 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)
    
    mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
    
    ->
    name=아이유
    args=('정우성', '01012341234', 'male')
    age=20
    kwargs={'mobile': '01012341234'}
    address=seoul
    ああ...いいですか.私はなぜIUが男なのかと思った.😮😮😮

    no4. 位置パラメータとしてdefault valueを指定する

    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
    よしよし!

    3.ソリューションの適用


    1)アプリケーションコード

    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")

    1-2)コード変換の適用(関数呼び出し:可変キーワードパラメータとキーワードパラメータの順序)


    #1.可変キーワードパラメータ>キーワードパラメータ

    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")

    #2.可変キーワードパラメータ<キーワードパラメータ

    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", address="seoul" ,mobile="01012341234")

    2)出力結果

    name=정우성
    args=('01012341234', 'male')
    age=20
    kwargs={'mobile': '01012341234'}
    address=seoul

    4.問題の整理


    関数parameterに挑戦させている感じがします...私はあなたを止めます.やってみましょう.やってる感じ?^^?
    しかし,本課題では,関数に複数のパラメータを指定してこれらの関数を呼び出す場合,どのような優先順位でコードを記述すべきか.理解できます!!

    V.最終整理


    情報ソース:https://velog.io/@ifyouseeksoomi/Backend-Python-%EA%B0%80%EB%B3%80-%EC%9D%B8%EC%88%98args%EC%99%80-%ED%82%A4%EC%9B%8C%EB%93%9C-%EC%9D%B8%EC%88%98kwargs
    (この方は本当にすごい!!)

    def関数名(?):
    ここにありますか.の優先順位
  • 一般位置因子
  • パラメータ
  • (指定された値のパラメータ)
  • 可変パラメータ(*args)
  • Keyword-Onlyパラメータ、
  • ではありません
  • デフォルトKeyword-Onlyパラメータ
    ただし、4、5番は(4、4、5")式のソートではなく(4、5、4"、5")式のソート
  • である.
  • 可変キーワードパラメータ(**kwargs)
  • 私の場合、3番目の問題では、「デフォルトのキーワードonlyパラメータではない」という経験がありますが、「5.デフォルトのキーワードonlyパラメータ」はありません.でも私は理解できます!
    複雑だけど、順番にこだわる変態コードみたい!