[TIL] Python - Function (2)


必要な正確なパラメータ数とその構造が分からない場合は?
def buy_A_car(options):
    print(f"다음 사양의 자동차를 구입하십니다:")


    for option in options:
        print(f"{option} : {options[option]}")


options = {"seat" : "가죽", "blackbox" : "최신"}


buy_A_car(options)


> 다음 사양의 자동차를 구입하십니다:
seat : 가죽
blackbox : 최신

👉🏻 パラメータとしてdictionaryを使用します!


しかし、parameter dictionaryのみを無条件に受け入れるという制約がある.
価格を払わなかったりStringを渡さなかったりすると、エラーが発生する可能性があります.
(何の値もない場合は、空の配列にも渡します!)
このとき使えるのはkeyword variablelength of arguments!
:数が不定で可変なキーワードarguments
:パラメータにアスタリスクを2つ追加**
**kwargs
  • パラメータフロー可能(0~N)
  • 予め定められていないが、必要なキーワード
  • を柔軟に使用することができる.
  • 辞書形式で指定します.
  • def buy_A_car(**kwargs):
        print(f"다음 사양의 자동차를 구입하십니다:")
    -
        for option in kwargs:
            print(f"{option} : {kwargs[option]}")
    このように宣言された関数は、次のように呼び出されます.
    buy_A_car(seat="가죽", blackbox="최신", tint="yes")
    kwargsパラメータはdictionaryとして関数に渡される.
    {'seat': '가죽', 'blackbox': '최신', 'tint': 'yes'}

    関数のbody内ではdictionaryのようにworksを使用できます.
    キーワードを使用せずに値を順番に渡す方法は?
    *args
  • メタグループに変換して関数に渡します
  • どちらも混ぜ合わせることができ、
    これはいかなる形式と数量の論点を許すためです!
    (parameterでは非常に柔軟な関数になります!)
    👇🏻👇🏻 私が解読したコード
    def sum_of_numbers(*args, **kwargs):
      result = 0
      if len(args) == 0:
        return result
      else:
        for i in args:
          result += i
        return result
    
    def what_is_my_full_name(**kwargs):
      temp = dict(reversed(list((kwargs).items())))
      print(temp)
    
      name = ""
    
      for arg in temp:
        if "last_name" in temp or "first_name" in temp:
          if "last_name" in temp and "first_name" in temp:
            if arg == "last_name":
              name += temp[arg]
            if arg == "first_name":
              name += " " + temp[arg]
          elif "last_name" in temp and "first_name" not in temp:
              if arg == "last_name":
                name += temp[arg]
          elif "last_name" not in temp and "first_name" in temp:
              if arg == "first_name":
                name += temp[arg]
        else:
          name = "Nobody"
    
      if len(temp) == 0:
        name = "Nobody"
        
      return name
    めちゃくちゃ+あちこちに詰まった和弦...ほほほ
    👇🏻👇🏻 別の分のコード
    def sum_of_numbers(*args):
      return sum(args)
    
    def what_is_my_full_name(**kwargs):
      if "first_name" in kwargs.keys():
        if "last_name" in kwargs.keys():
         return kwargs["last_name"] + " " + kwargs["first_name"]
        else:
          return kwargs["first_name"]
      else:
        if "last_name" in kwargs.keys():
          return kwargs["last_name"]
        else:
          return "Nobody"
    *kwargs,argsを活用して、もう一度勉強しましょう!
    以前にFunctions(2)の投稿で整理しました.
    wecodeのコンセプトを見て整理してみましょう!

    ネスト機能



    👆🏻 decoratorに関する概念はありません.
    少しも理解できないまま解けた自分が...(かわいそう)
    nested function
  • 重畳関数
    :関数に関数が宣言されています.
    :親の親関数でのみ呼び出すことができます.
    :読み取り可能、接触による
  • の使用

    どくせい

    def print_all_elements(list_of_things):
        ## 중첩함수 선언
        def print_each_element(things):
            for thing in things:
                print(thing)
    
        if len(list_of_things) > 0:
            print_each_element(list_of_things)
        else:
            print("There is nothing!")
    関数に重複するコードがある場合は、重複関数として宣言して可読性を向上させる必要があります.
    each elements関数をall elements関数で宣言します.
    必要に応じて、内部関数を繰り返すしかありません.

    closure

    def parent_function():
        def child_function():
            print("this is a child function")
    
    
        child_function()
    
    
    parent_function()
    > "this is a child function"
    親関数の変数、情報を使用するには、オーバーラップ関数を使用することもできます.
  • 親関数の変数を外部から直接アクセスして隔離するが、
  • は、重畳関数演算により分離された親関数の変数
  • を演算する.
  • 重畳関数は、重畳関数内で親関数の変数または情報を使用する.
  • 親関数は、戻り値でオーバーラップ関数を返します.
  • 親関数から返されるため、親関数の変数は直接アクセスできませんが、親関数から返されるオーバーラップ関数で使用できます.
    :ファクトリアレイの実装時、関数またはオブジェクトの作成時
    設定値を露出せずに変更できない場合に使用します!
  • def generate_power(base_number):
        def nth_power(power):
            return base_number ** power
    
    
        return nth_power
     
    calculate_power_of_two = generate_power(2)
    calculate_power_of_two(7)
    > 128
    calculate_power_of_two(10)
    > 1024
    
    
    calculate_power_of_seven = generate_power(7)
    calculate_power_of_seven(3)
    > 343
    calculate_power_of_seven(5)
    > 16907
    これは特定の数字の乗算を求める関数です.
    これはタイムリーに設定された求数乗の関数です!
    def calculate_power_of_two(power):
        return 2 ** power
    
    
    calculate_power_of_two(7)
    > 128
    calculate_power_of_two(10)
    > 1024
    あるいは
    def calculate_power(number, power):
        return number ** power
    
    
    calculate_power(2, 7)
    > 128
    2乗を表す関数を使用します.
    前述のようにネスト関数を使用する場合、
    毎回入力するパラメータ数の積を求めることができます!

    Decorator (1)


    装飾講座
    「デコレーション師」というコンセプトは本当にわかりにくく、その講座を聞いて助かりました.
    装飾師とは、
  • 関数をパラメータとして起動!
  • クラスでメソッドを作成する場合、@で始まるdecoratorをよく使用します...
  • @decoratorで宣言された関数は
    この関数を実行する前に、decoratorロールの関数を最初に実行し、既存の関数を実行します.
    :関数を変更せずに追加機能を実現するために使用します.

  • 👆🏻 関数の作成と戻り

    decoratorがいったいどんな順番で行われているのか知りたいです.
    👇🏻👇🏻 下図を見て、少し分かりました

    宣言された関数を実行するためにdecoratorを貼り付けると、その関数が実行される前に
    decoratorとして宣言された関数に移動し、パラメータとして受信した呼び出す関数を返します.
    したがって、decoratorとして宣言された関数は、まずその内部で実行されます(trace-wrapper).
    そしてdecoratorを宣言する関数を呼び出す!!(hello)

    Decorator (2)


    パラメータと戻り値を扱うレコーダ