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

Introduction détaillée aux fermetures Python

Mar 26, 2017 pm 06:02 PM

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
Copier après la connexion

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__ == '__main__':
    func = line_def(2, 3)
    print(func(5))# 输出13
Copier après la connexion

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 de ce site Web
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

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser la belle soupe pour analyser HTML? Comment utiliser la belle soupe pour analyser HTML? Mar 10, 2025 pm 06:54 PM

Comment utiliser la belle soupe pour analyser HTML?

Filtrage d'image en python Filtrage d'image en python Mar 03, 2025 am 09:44 AM

Filtrage d'image en python

Comment utiliser Python pour trouver la distribution ZIPF d'un fichier texte Comment utiliser Python pour trouver la distribution ZIPF d'un fichier texte Mar 05, 2025 am 09:58 AM

Comment utiliser Python pour trouver la distribution ZIPF d'un fichier texte

Comment travailler avec des documents PDF à l'aide de Python Comment travailler avec des documents PDF à l'aide de Python Mar 02, 2025 am 09:54 AM

Comment travailler avec des documents PDF à l'aide de Python

Comment se cacher en utilisant Redis dans les applications Django Comment se cacher en utilisant Redis dans les applications Django Mar 02, 2025 am 10:10 AM

Comment se cacher en utilisant Redis dans les applications Django

Comment effectuer l'apprentissage en profondeur avec TensorFlow ou Pytorch? Comment effectuer l'apprentissage en profondeur avec TensorFlow ou Pytorch? Mar 10, 2025 pm 06:52 PM

Comment effectuer l'apprentissage en profondeur avec TensorFlow ou Pytorch?

Comment implémenter votre propre structure de données dans Python Comment implémenter votre propre structure de données dans Python Mar 03, 2025 am 09:28 AM

Comment implémenter votre propre structure de données dans Python

Sérialisation et désérialisation des objets Python: partie 1 Sérialisation et désérialisation des objets Python: partie 1 Mar 08, 2025 am 09:39 AM

Sérialisation et désérialisation des objets Python: partie 1

See all articles