python 3進級編(一)--関数の深い理解


python 3進級編(一)--関数の深い理解
この文章を読んで何を学ぶことができますか.関数といえば、関数のパラメータ、戻り値、関数アドレスなどを思い浮かべるかもしれませんが、python 3の関数の使い方は非常に柔軟です.例えば、関数のネスト定義を許可し、関数をパラメータや変数として伝達し、関数が関数を返すことを許可します.この文章では、これらの「柔軟」の使い方を説明します.
--これはいい博文だと思いますが、小さないいねをしてほしいです.支持に感謝します.
目次

  • python 3進級編(一)--関数の深い理解
  • 1また関数を見る
  • 1.1関数呼び出しの2形式
  • 2関数変数に値を付け、関数を削除しようとする
  • 2.1変数に関数を割り当てる
  • 2.2 del関数を試してみる
  • 3関数ネスト定義
  • 3.1定義関数のネストを試みる
  • 3.2ネスト定義の関数を参照により呼び出す
  • 4関数戻り関数
  • 5関数をパラメータとして渡す

  • 1関数を見る
    基礎編では関数の定義と呼び出しを詳しく説明したが,ここではより深い研究の下で説明した.次の例では、関数の定義と呼び出しを思い出すのに役立ちます.コードの例:
    def Function():
        print("Call Function")
        return 0
    
    print(Function())
    

    実行結果:
    Call Function
    0
    

    1.1関数呼び出しの2つの形式
      関数呼び出しは、持つかどうか()2つに分けられますが、カッコを付けると関数が実行され、カッコ内の実パラメータが形パラメータに渡され、関数の戻り値が呼び出し先に渡されます.カッコを付けない場合、呼び出されたのは関数のアドレスであり、関数は実行されません.コードの例:
    def Function():
        print("Call Function")
        return 0
    
    #        
    print(Function())
    print("---------------------------------")
    print(Function)
    

    実行結果:
    Call Function
    0
    ---------------------------------
    
    

    また、関数アドレスが変動していることがわかります.
    2関数は変数に割り当てられ、関数を削除しようとします
    2.1変数に関数を割り当てる
      上記の関数の2つの呼び出し形式に基づいて、関数を変数に割り当てるには、変数が関数の戻り値を取得することと、関数アドレスを取得することの2つの可能性があります.戻り値を取得するのは分かりやすいですが、関数の実行結果を取得することに相当します.アドレスを取得するのに何の役に立ちますか?変数が関数アドレスを取得すると,その変数に相当してもこの関数を指す,すなわちこの変数によってこの関数を呼び出すことができる.これは実はc/c++のポインタの概念です.コードの例"
    def Function():
        print("Call Function")
        return 0
    
    Func1 = Function()                  #        0
    print(Func1)
    print("--------------------------------------------------")
    Func2 = Function                    #       
    print(Func2)
    
    print("--------------------------------------------------")
    Func2()                             #         
    

    実行結果:
    Call Function
    0
    --------------------------------------------------
    
    --------------------------------------------------
    Call Function
    

      関数は持たない()変数に渡されるのは関数アドレスであり、変数が関数アドレスを持っている場合は()を加えると関数実行を呼び出すことができる.もちろん、変数が格納されている関数アドレスは、他の変数に値を割り当て続けることができます.より正確には、変数にアドレスを割り当てることは、オブジェクト(ここでは関数)に新しい参照を作成し、この参照によってオブジェクト自体にアクセスすることができます.(実際にpython 3はすべて引用で、後に引用を1枚補充します).
    2.2 del関数の試行
      python 3にキーワードがあることを知っていますdel各オブジェクトの参照を削除できます.削除するのは直接削除するのではなく、参照自体であることに注意してください.1つのオブジェクトが参照によって指向されていない場合、ゴミ回収メカニズムは自動的に解放されます.関数定義時の関数名もその関数の1つの参照にすぎず、同様にこの参照を削除することができます.del関数は実際にその関数の最初の参照を削除している.
    def Function():
        print("Call Function")
        return 0
    
    Func = Function                     #       
    del Function
    
    # Function()                        #error: NameError: name 'Function' is not defined
    Func()                              #         
    

    実行結果:
    Call Function
    

      関数名Functionこの関数の作成時に存在する最初の関数参照であり、この関数に渡すことで新たな参照を作成できるFunc、この場合参照を削除Functionであれば参照Func依然として有効であるがFunction削除された後は使用できない.要するに、関数定義時に関数名が最初の参照であり、関数に複数の参照を作成できます.関数の参照は、最初の参照であっても削除できます.
    3関数ネスト定義
    3.1ネスト定義関数の試行
      python 3では関数のネスト定義を許可し、例えば関数Func1では関数Func2を定義でき、関数Func2では関数Func3を定義できる.関数を定義するときは呼び出すためですが、関数がネストされているときの役割ドメインに注意してください.関数Func2関数Func1で定義されている場合、Func1関数でのみ呼び出すことができるFunc2関数は、外部から直接呼び出すことができない(グローバル関数との最大の違いは役割ドメイン).実行結果:
    def Func1():
        print("Call Func1")
    
        def Func2():
            print("Call Func2")
    
            def Func3():
                print("Call Func3")
    
            Func3()
    
        Func2()
        #Func3()                         #error: NameError: name 'Func2' is not defined
    
    Func1()                              #  Func1,     Func2 Func3
    #Func2()                             #error: NameError: name 'Func2' is not defined
    #Func3()                             #error: NameError: name 'Func2' is not defined
    

    コードの例:
    Call Func1
    Call Func2
    Call Func3
    

    Func2関数内で呼び出されたFunc3関数、Func1関数内で呼び出されたFunc2関数なので、Func1関数を呼び出すと、実際に呼び出されたFunc2およびFunc3関数が付属しています.
    3.2ネスト定義を参照して呼び出す関数
      関数の内部にネストされて定義された関数は、関数の外部から直接呼び出すことはできませんが、前に述べた関数には複数の参照がありますが、実際には関数が参照によって呼び出されます.グローバルリファレンスを使用して、内部ネスト定義の関数を直接指すことができ、関数の外部でネスト定義の関数を呼び出すことができます.コードの例:
    Func = None
    
    def Func1():
        global Func                     #      
        print("Call Func1")
    
        def Func2():
            print("Call Func2")
    
        Func = Func2
        Func2()
    
    Func1()                             #  Func1,     Func2 Func3
    print("---------------------------------------------")
    Func()                              #                  
    

    実行結果:
    Call Func1
    Call Func2
    ---------------------------------------------
    Call Func2
    

    4関数戻り関数
      は、()の関数名を持たない関数のアドレスを呼び出し、それを関数の戻り値とすると、関数呼び出しにおいて戻り関数のアドレスが得られる.コードの例:
    def Func1():
        print("Call Func1")
    
        def Func2():
            print("Call Func2")
    
        return Func2
    
    Func = Func1()                            #  Func1,     Func2 Func3
    print("------------------------------------")
    Func()                                    #               
    

    実行結果:
    Call Func1
    ------------------------------------
    Call Func2
    

      は関数を用いて内部関数のアドレスを返し,外部アクセス内部関数も実現できる.関数ネスト定義と関数戻り関数を組み合わせると、関数呼び出しに「かっこ」が付く場合があり、興味深いです.コードの例:
    def FuncA(NumA):
        print("Call FuncA", "Param:%d" % NumA)
    
        def FuncB(NumB):
            print("Call FuncB", "Param:%d" % NumB)
    
            def FuncC(NumC):
                print("Call FuncC", "Param:%d" % NumC)
    
                return NumC                                 #FuncC     
            return  FuncC                                   #FuncB      FuncC  
        return  FuncB                                       #FuncA      FuncB  
    
    print(FuncA(1)(2)(3))                                   #                 
    print("---------------------------------------")
    print(((FuncA(1))(2))(3))                               #           
    

    実行結果:
    Call FuncA Param:1
    Call FuncB Param:2
    Call FuncC Param:3
    3
    ---------------------------------------
    Call FuncA Param:1
    Call FuncB Param:2
    Call FuncC Param:3
    3
    

    論理は複雑ではありません.私たちは理にかなっています.FuncA(1)関数を呼び出して値を渡す1FuncAで定義しているFuncBおよびFuncC関数は呼び出されていないので実行されない.そしてFuncA呼び出しが終了して次の関数に戻るFuncBアドレス、 +()また関数呼び出しを構成しているのでFuncA(1)(2)ここまで関数呼び出しが開始されているFuncBそしてその値を伝えている2、同じ理屈FuncA(1)(2)(3)実行できるFuncCというのも理解に難くありません.実行の順序はネストされた順序で外から内へ,パラメータリスト()も1つずつ対応しており,繰返し実行可能な基礎は関数戻り値が次の実行関数のアドレスを返すことである.  が多層関数に関連する場合、内層関数は外層関数のパラメータにアクセスできます.同じ名前の変数の場合、最下層変数に優先的にアクセスします.コードの例:
    def FuncA(NumA):
        Str = "A"
        def FuncB(NumB):
            Str = "A"
            def FuncC(NumC):
                Str = "A"                                   #          ,      
                print(NumA, NumB, NumC, Str)                #             
    
                return NumC                                 #FuncC     
            return  FuncC                                   #FuncB      FuncC  
        return  FuncB                                       #FuncA      FuncB  
    
    FuncA(1)(2)(3)                                          #                 
    

    実行結果:
    1 2 3 A
    

    5関数をパラメータとして渡す
      ある関数が一部の機能を実現し、もう一部の機能が一時的に不確定である場合、この不確定な機能をパラメータとして呼び出しのために個別にカプセル化することができる.
    def Function(Func):
        print("Call Function")
        Func()
    
    def Func1():
        print("Call Func1")
    
    def Func2():
        print("Call Func2")
    
    Function(Func1)                                      # Func1        Function  
    print("---------------------------")
    Function(Func2)                                      # Func2        Function  
    

    実行結果:
    Call Function
    Call Func1
    ---------------------------
    Call Function
    Call Func2
    

      ここのFunction関数機能は2つある:1、自分の関数内の論理を実現する.2、外部から入力された関数を呼び出すが、外部関数が実行するロジックFunction関心がなく、外部関数が自分で決める.python 3には装飾器の概念がありますが、実は関数のパラメータとしての使い方の進化です.後の章でpython装飾器について紹介します.