関数プログラミング--閉パッケージ

3884 ワード

関数プログラミング–閉パッケージ
*原理
閉パッケージ=環境変数+関数
最も簡単な閉パッケージ
def curve_pie():
    a =25
    def curve(x):
        return a*pow(x,2)
    return curve
f =curve_pie()
print(f(2))

出力結果:ans=100検査関数が閉じているかどうかを検査する
print(f.__closure__)
#     a=25
print(f.__closure__[0].cell_contents)

出力結果
(0x00000191D32A8228: int object at 0x000000005BE16F40>,)
25

この関数は閉じています
旅行者の質問を解く:
*初期の位置(origin=0)、全部で3歩(step)歩いて、第1歩は2で、第2歩は3で、第3歩は5で、今どうして位置(new_pos)を求めますか?(閉包と非閉包の形式で解く)
まず非閉パケット形式を用いて解く

#     
orgian = 0
def go(step):
    global orgian
    new_pos = orgian + step
    orgian = new_pos
    return  orgian
print(go(2))
print(go(3))
print(go(5))

結果:2 5 10
キー:
     
def go(step):
    new_pos = orgian + step
    orgian = new_pos

エラー:UnboundLocalError:local variable‘orgian’referenced before assignment原因は:orgian=new_posはpythonでorgianが局所変数であることを示していますが、前のステップで使ったorginはグローバル変数で、衝突したら、エラーを報告します.したがって、orgianをグローバル変数として定義するには、orgianの前にglobalを追加する必要があります.しかし実際の符号化ではglobalで定義されていればパッケージング性はない.特にいいわけではありません.したがって,閉パケット形式で符号化するのが効果的である.
閉パッケージ形式で解く
#    
orgian = 0
def f1(pos):
    def f2(step):
        nonlocal pos
        new_pos = pos +step
        pos = new_pos
        return new_pos
    return f2
f = f1(orgian)
print(f(2))
print(f(3))
print(f(5))

結果:2 5 10閉パッケージ形式かどうかを確認
f = f1(orgian)
print(f(2))
print(f.__closure__[0].cell_contents)
print(f(3))
print(f.__closure__[0].cell_contents)
print(f(5))
print(f.__closure__[0].cell_contents)

結果:2 2 2 5 5 10は閉パッケージ形式であることを示した.
キー:
    def f2(step):
        nonlocal pos
        new_pos = pos +step
        pos = new_pos

nonlocalを使用してposを定義し、閉パッケージ内のグローバル変数であり、originの値は最後に変更されません.