関数プログラミング--閉パッケージ
3884 ワード
関数プログラミング–閉パッケージ
*原理
閉パッケージ=環境変数+関数
最も簡単な閉パッケージ
出力結果:ans=100検査関数が閉じているかどうかを検査する
出力結果
この関数は閉じています
旅行者の質問を解く:
*初期の位置(origin=0)、全部で3歩(step)歩いて、第1歩は2で、第2歩は3で、第3歩は5で、今どうして位置(new_pos)を求めますか?(閉包と非閉包の形式で解く)
まず非閉パケット形式を用いて解く
結果:2 5 10
キー:
エラー:UnboundLocalError:local variable‘orgian’referenced before assignment原因は:orgian=new_posはpythonでorgianが局所変数であることを示していますが、前のステップで使ったorginはグローバル変数で、衝突したら、エラーを報告します.したがって、orgianをグローバル変数として定義するには、orgianの前にglobalを追加する必要があります.しかし実際の符号化ではglobalで定義されていればパッケージング性はない.特にいいわけではありません.したがって,閉パケット形式で符号化するのが効果的である.
閉パッケージ形式で解く
結果:2 5 10閉パッケージ形式かどうかを確認
結果:2 2 2 5 5 10は閉パッケージ形式であることを示した.
キー:
nonlocalを使用してposを定義し、閉パッケージ内のグローバル変数であり、originの値は最後に変更されません.
*原理
閉パッケージ=環境変数+関数
最も簡単な閉パッケージ
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の値は最後に変更されません.