pythonステップアップシリーズ学習(三)
3742 ワード
pythonの閉パッケージ
前のセクションの戻り関数をレビューします.
実はここのg()はf()関数の外に置くことができて、中に入れる必要はありません:
しかし、閉包と1つの関数は別の関数の中ではあまり差がありません.それ以外に、中に置く必要がある関数は外層関数のパラメータを使用する必要があります.
例えばここで内層関数g()は外層関数f()におけるパラメータ変数iを用いているが,ここでのiは常に変化しており,最終的にf 1(),f 2(),f 3()を呼び出したときのiはすでに3になっているので,最終的な結果はいずれも9である.
テーマ:戻り閉パケットはループ変数を参照できません.count()関数を書き換えて、1 x 1、2 x 2、3 x 3を計算できる関数を正しく返してください.
ああ、この問題は私にはできませんでしたが、、、
答えを見てみました.
実は閉パッケージは内層関数が外層関数の変数を引用しているのですから、1,4,9の結果を出力するには、メモリ関数の変数を外層関数の変化に伴って変化させないか、直接内層関数の中で先に計算して、1つの変数で格納しなければなりません~
前のセクションの戻り関数をレビューします.
#python
def f():
print(" f() ")
def g():
print(" g() , f() ")
return g #f()
if __name__=="__main__":
g=f()
print('*'*30)
g()
実はここのg()はf()関数の外に置くことができて、中に入れる必要はありません:
def g():
print(" g(), f() ")
def f():
print(" f(), g()")
return g #
if __name__=="__main__":
g_1=f()
g_1()
しかし、閉包と1つの関数は別の関数の中ではあまり差がありません.それ以外に、中に置く必要がある関数は外層関数のパラメータを使用する必要があります.
def f():
fs=[] # g
for i in range(1,4):
def g():
return i*i
fs.append(g)
return fs
if __name__=="__main__":
f1,f2,f3=f()
print(f1(),f2(),f3())
例えばここで内層関数g()は外層関数f()におけるパラメータ変数iを用いているが,ここでのiは常に変化しており,最終的にf 1(),f 2(),f 3()を呼び出したときのiはすでに3になっているので,最終的な結果はいずれも9である.
テーマ:戻り閉パケットはループ変数を参照できません.count()関数を書き換えて、1 x 1、2 x 2、3 x 3を計算できる関数を正しく返してください.
ああ、この問題は私にはできませんでしたが、、、
答えを見てみました.
def count():
fs = []
for i in range(1, 4):
j=i*i
def f(j):
def g():
return j
return g
fs.append(f(j))
return fs
f1, f2, f3 = count()
print f1(), f2(), f3()
実は閉パッケージは内層関数が外層関数の変数を引用しているのですから、1,4,9の結果を出力するには、メモリ関数の変数を外層関数の変化に伴って変化させないか、直接内層関数の中で先に計算して、1つの変数で格納しなければなりません~