高次関数と関数のネスト

2353 ワード

1.高次関数:pythonではすべてオブジェクトであるため、変数はオブジェクトであり、関数もオブジェクトであり、関数も変数のように伝達することができる.1つの関数をパラメータとして別の関数に渡すか、
1つの関数の戻り値は別の関数(戻り値がその関数自体であれば再帰)であり、その1つを満たすと高次関数である.
関数名は関数オブジェクトの参照であり、関数名も変数であり、関数名の後ろに()を付けると実行関数を表します.
1)関数をパラメータとして
def bar():
    print("in the bar..")

def foo(func):
    func()
    print("in the foo..")

foo(bar)

2)戻り値は関数
def bar():
    print("in the bar..")

def foo(func):
    print("in the foo..")
    return bar

res = foo(bar)
res()

 
2.関数ネスト:ある関数で別の関数を定義し、外部関数が呼び出されると内部関数が再定義され、内部関数が返されない場合、外部関数の実行が終了すると、
内部関数オブジェクトは破棄されます.簡単な例を示します.
def test1():
    age = 10
    print(age)
    def test2():
        te = 5
        print(age)
        def test3():
            print(te)
        test3()
    test2()

test1() # 10 10 5

注意:内部ネスト関数は毎回再定義されるため、頻繁に使用される関数では内部定義ネスト関数は推奨されません.そうしないと効率が低下します.
 
3.クローズド・パッケージ:外部関数に内部関数を定義し、内部関数に外部関数の一時変数を使用し、外部関数の戻り値は内部関数の参照です.これで閉パッケージが構成されます.
したがって,閉パケットは高次関数に適合し,ネスト関数を満たす.
一般的に,我々の認識では,1つの関数が終了すると,関数の内部のすべてのものが解放され,メモリに返され,局所変数が消失する.しかし閉鎖は特殊な状況であり、
外部関数が終了したときに自分の一時変数が将来内部関数で使用されることに気づいたら、この一時変数を内部関数にバインドし、自分で終了します.
def outer(a):
    b = 10            # a   b           
    def inner():
        a = a * 2
        print(a + b)  #                 
    return inner      #               

#          5
#             a = 5 b = 10 ,       ,               demo
#                          ,            ,          
demo = outer(5)
demo()  # 15
demo2 = outer(7)
demo2() # 17

閉パッケージ内の内部関数は、外部関数のローカル変数を変更します.
-閉包内関数では、外部関数にバインドされた一時変数を任意に使用できますが、外部関数の一時変数の数値を変更したい場合に問題が発生します.
-基本的なpython構文では、1つの関数でグローバルデータを任意に読み込むことができますが、グローバルデータを変更するには2つの方法があります.
1)globalはグローバル変数を宣言します.そうしないと、付与操作は変数を再定義します.
2)グローバル変数が可変型データの場合は修正可能
-閉パッケージ内の関数も同様です.内関数で閉パッケージ変数(外関数が内関数にバインドされているローカル変数)を変更したい場合:
1)python 3ではnonlocalキーワードで変数を宣言し、この変数が局所変数空間の変数ではないことを示し、上の変数空間にこの変数を探す必要がある.
2)python 2ではnonlocalというキーワードはなく,閉パケット変数をリストなどの可変タイプデータに変更することができる.
def outer(a):
    b = 10
    c = [a]
    def inner():
        nonlocal b  #             b  
        b += 1
        c[0] += 1   #                
        print(c[0])
        print(b)
    return inner

demo = outer(5)
demo() # 6  11