函数 - 关于python闭包的一些疑问
PHPz
PHPz 2017-04-17 17:29:24
0
4
228
def count():
    fs = []
    for i in range(1, 4):
        def f(j):
            def g():
                return j*j
            return g    
        r = f(i)    
        fs.append(r)    #fs作为列表,为什么可以append(r)?(而r是f所返回的函数)
    return fs           #个人的想法应该是fs.append(r())

f1, f2, f3 = count()
print f1(), f2(), f3()

想弄明白的是:这里传入append的r是以什么形式传入的呢
谢谢各位指教:D

PHPz
PHPz

学习是最好的投资!

全員に返信(4)
迷茫

は、遅延呼び出しと同様に、関数定義の形式で渡されます。

の例では明らかではありません。 リーリー

関数の戻り値 r の r は変数と考えることができますが、この変数は関数の定義を保存します。
関数の実際の呼び出しは後で x() を介して行われます

いいねを押す +0
左手右手慢动作

r は オブジェクト であり、このオブジェクトの type は関数です。

言い換えると、r は

のような関数型のオブジェクトです。
  • 1 は、整数 型のオブジェクト

  • です。
  • 'hi' は、 と同様に、

    String
  • 型のオブジェクトです。
いいねを押す +0
大家讲道理

fs.append(r()) に変更することもできますが、関数の意味が異なります。 count() 関数を実行すると結果 [1, 4, 9] が返されるため、print f1(), f2(), f3() を使用することはできなくなります。結果を出力します。理由は次のとおりです。

リーリー

これは g ではなく g() であることに注意してください。そのため、count() を実行すると返されるものは、実際には [g1, g2, g3] 3 つのクロージャー関数を含むリストです。各クロージャー関数は異なる自由変数 (それぞれ 1、2、3) をバインドします。 )、このリストを f1, f2, f3 に展開した後、print f1(), f2(), f3() を実行することは、3 つの関数を実行して結果を出力することと同等であるため、最終出力は 1, 4, 9

になります。
いいねを押す +0
大家讲道理

f1 = fs[0] = r = g

だから

f1()

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート