函数 - 关于python闭包的一些疑问
PHPz
PHPz 2017-04-17 17:29:24
0
4
241
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

学习是最好的投资!

répondre à tous(4)
迷茫

est transmis sous la forme d'une définition de fonction, similaire à un appel différé. Ce n'est pas évident dans votre exemple,

.
def count():
    def r():
        return "hello world"
    return r          
x =  count()  
print x #<function r at 0x7fc562978668>
print x() # hello world

Vous pouvez considérer le r dans le retour r dans la fonction comme une variable, mais cette variable enregistre la définition de la fonction
L'appel réel à la fonction se fait via x() plus tard

.
左手右手慢动作

r est un objet, et le type de cet objet est une fonction.

En d'autres termes, r est un objet de type fonction, comme

  • 1 est un objet de type

    entier
  • 'hi' est un objet de type String tout comme

大家讲道理

Il est également possible de changer

en fs.append(r()), mais la signification de la fonction est différente Après avoir exécuté la fonction count(), elle renverra le résultat [1, 4, 9], et vous ne pourrez plus utiliser print f1(), f2(), f3() pour. imprimez le résultat. La raison est :

r=f(i)=g
Notez que ce n'est

pas g, donc ce qui est renvoyé en exécutant g() est en fait count() une liste contenant trois fonctions de fermeture, chaque fonction de fermeture lie différentes variables libres (respectivement 1, 2, 3), donc après avoir décompressé cette liste dans [g1, g2, g3], exécuter f1, f2, f3 équivaut à exécuter trois fonctions et à imprimer les résultats, donc le résultat final est print f1(), f2(), f3()1, 4, 9

大家讲道理

f1 = fs[0] = r = g

C'est pourquoi

f1()

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal