pythonステップアップシリーズ学習(三)

3742 ワード

pythonの閉パッケージ
前のセクションの戻り関数をレビューします.
#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つの変数で格納しなければなりません~