Maison  >  Article  >  développement back-end  >  Introduction détaillée aux fermetures Python

Introduction détaillée aux fermetures Python

高洛峰
高洛峰original
2017-03-26 18:02:011219parcourir

En informatique, la fermeture (Closure) est l'abréviation de fermeture lexicale (Lexical Closure), qui est une fonction qui fait référence à des variables libres. La variable libre référencée restera avec la fonction même après avoir quitté l'environnement dans lequel elle a été créée. Il existe donc une autre façon de dire qu’une fermeture est une entité composée d’une fonction et de son environnement de référence associé. Les fermetures peuvent avoir plusieurs instances au moment de l'exécution, et différents environnements de référence et la même combinaison de fonctions peuvent produire différentes instances.

Je préfère cette dernière solution, considérant la fermeture comme une structure d'organisation du code, pour des raisons que j'expliquerai plus tard.

Quelle est la structure du code de fermeture ?

En Python, tout est un objet, qui inclut bien sûr des fonctions. Les objets fonction peuvent être affectés à une variable, et la fonction peut être appelée via cette variable ; les objets fonction peuvent également être passés en tant que paramètres et peuvent également être utilisés comme résultat de retour d'une fonction. De plus, en Python, les fonctions peuvent être imbriquées.

Python est basé sur des objets fonction et prend en charge la structure grammaticale des fermetures

Regardons d'abord un exemple

def f1():
    name1 = 'Alice'
    name2 = 'Bob'
    def f2():
        print('hello,%s,%s' %(name1,name2))    return f2 


if __name__ == '__main__':
    name1 = 'David'
    name2 = 'Frank'
    func = f1()
    func()
    print(func.__closure__)
    print(func.__closure__[0].cell_contents)
    print(func.__closure__[1].cell_contents)# 输出hello,Alice,Bob
(<cell at 0x03A55CF0: str object at 0x03CBEA20>, <cell at 0x03CBEAD0: str object at 0x03CBEAA0>)
Alice
Bob

La fonction f2 est définie à l'intérieur de la fonction f1. Et les variables nom1 et nom2 définies dans f1 sont appelées.

f1 renvoie l'objet fonction f2, mais en fait le f2 renvoyé inclut déjà les variables name1 et name2 dans f1, ce qui peut être vu à partir des résultats d'exécution du code.

Dans le programme principal, bien que name1 et name2 soient redéfinis, la valeur de la variable lorsque la fonction func est exécutée est toujours appelée lorsqu'elle est définie, c'est-à-dire sa variable d'environnement de référence, et non la valeur de la variable lorsqu'elle est utilisée.

Pour résumer, en Python, une fermeture est un bloc de code qui contient des fonctions et des variables d'environnement référencées. J'ai tendance à considérer les fermetures comme une structure de code plutôt que comme une fonction, car le premier appel lorsqu'il est utilisé, il enveloppe uniquement l'environnement de référence de la fermeture et de la fonction interne, et le renvoie en tant qu'objet de fonction, sans exécuter la fonction interne. Lorsque cet objet de fonction est appelé, la fonction de fonction interne sera exécutée.

La valeur de la variable d'environnement référencée est stockée dans la propriété de fermeture de l'objet fonction. La fermeture contient un tuple. Chaque élément de ce tuple est un objet de type cellule. Nous voyons que la première cellule contient Alice, qui est la valeur de la variable d'environnement name1 lorsque nous avons créé la fermeture. Cela peut être vu à partir des résultats du code ci-dessus.

Maintenant, regardez en arrière et voyez l’explication de l’encyclopédie sur les fermetures.

Maintenant, donnez un autre exemple :

# 此例子转自伯乐在线def line_def(a, b):
    def line(x):
        return a * x + b    return lineif __name__ == &#39;__main__&#39;:
    func = line_def(2, 3)
    print(func(5))# 输出13

Dans cet exemple, la ligne de fonction et les variables d'environnement a, b forment une fermeture, il suffit de changer les valeurs​​ de a, b Différentes fonctions de ligne droite peuvent être obtenues, ce qui améliore l'encapsulation, de sorte que nous n'avons qu'à prêter attention aux paramètres a et b, et ne nous soucions pas de la mise en œuvre de la ligne droite interne.

La plus grande caractéristique de la fermeture est qu'elle peut lier les variables de la fonction externe à la fonction interne et renvoyer la fonction après avoir lié la variable (c'est-à-dire la fermeture à ce moment-là, même si l'environnement). dans lequel la fermeture est générée (fonction externe ) a été libérée, la fermeture existe toujours.

Les décorateurs sont une application majeure des fermetures, mais ils transmettent des fonctions. J'écrirai ceci la prochaine fois.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn