Cet article présente principalement les informations pertinentes sur l'utilisation des fermetures dans le didacticiel de base de Python. J'espère que cet article pourra vous aider. Les amis dans le besoin peuvent se référer au
Tutoriel de base de Python. utiliser des fermetures
Préface :
La fermeture (closure) est une structure grammaticale importante dans la programmation fonctionnelle. La programmation fonctionnelle est un paradigme de programmation (et la programmation procédurale et la programmation orientée objet sont également des paradigmes de programmation). En programmation orientée processus, nous avons vu des fonctions ; en programmation orientée objet, nous avons vu des objets. L'objectif fondamental des fonctions et des objets est d'organiser le code d'une certaine manière logique et d'améliorer la réutilisabilité du code. La fermeture est également une structure d'organisation du code, qui améliore également la réutilisabilité du code.
Différentes langues implémentent les fermetures de différentes manières. Python est basé sur des objets de fonction et prend en charge la structure syntaxique des fermetures (nous avons vu à plusieurs reprises que Python utilise des objets pour implémenter une syntaxe spéciale dans des méthodes spéciales et des multi-paradigmes). Tout en Python est un objet, et la structure grammaticale de la fonction est également un objet. Dans un objet fonction, nous utilisons l'objet fonction comme un objet normal, par exemple en changeant le nom de l'objet fonction ou en passant l'objet fonction en tant que paramètre.
Portée de l'objet fonction
Comme les autres objets, l'objet fonction a également sa portée de survie, qui est la portée de l'objet fonction. Les objets fonction sont définis à l'aide d'instructions def et la portée de l'objet fonction est la même que le niveau auquel se trouve def. Par exemple, dans le code suivant, la ligne de fonction que nous définissons dans la portée d'affiliation de la fonction line_conf ne peut être appelée que dans la portée d'affiliation de line_conf.
def line_conf(): def line(x): return 2*x+1 print(line(5)) # within the scope line_conf() print(line(5)) # out of the scope
La fonction ligne définit une ligne droite (y = 2x + 1). Comme vous pouvez le voir, la fonction line peut être appelée dans line_conf(), mais appeler line en dehors de la portée provoquera l'erreur suivante :
NameError: name 'line' is not defined
signifie qu'à ce stade temps Déjà en dehors du champ d'application.
De même, si vous utilisez lambda pour définir une fonction, la portée de l'objet fonction est la même que le niveau où se trouve le lambda.
Fermeture
Une fonction est un objet, elle peut donc être utilisée comme résultat de retour d'une fonction.
def line_conf(): def line(x): return 2*x+1 return line # return a function object my_line = line_conf() print(my_line(5))
Le code ci-dessus peut être exécuté avec succès. Le résultat de retour de line_conf est affecté à l'objet ligne. Le code ci-dessus imprimera 11.
Que se passe-t-il si une variable externe est référencée dans la définition de line() ?
def line_conf(): b = 15 def line(x): return 2*x+b return line # return a function object b = 5 my_line = line_conf() print(my_line(5))
On peut voir que la variable de haut niveau b est référencée dans le bloc de programme subordonné défini par ligne, mais l'information b existe en dehors de la définition de ligne ( b La définition de n'est pas dans le bloc de ligne subordonné). On appelle b la variable d'environnement de la ligne. En fait, lorsque line est utilisée comme valeur de retour de line_conf, line inclut déjà la valeur de b (bien que b ne soit pas affilié à line).
Le code ci-dessus imprimera 25, c'est-à-dire que la valeur b référencée par la ligne est la valeur b disponible pour référence lorsque l'objet fonction est défini, pas la valeur b lorsqu'il est utilisé.
Une fonction et ses variables d'environnement forment ensemble unefermeture. En Python, ce qu'on appelle la fermeture est un objet fonction qui contient la valeur d'une variable d'environnement. Les valeurs des variables d'environnement sont stockées dans l'attribut __closure__ de l'objet fonction. Par exemple, le code suivant :
def line_conf(): b = 15 def line(x): return 2*x+b return line # return a function object b = 5 my_line = line_conf() print(my_line.__closure__) print(my_line.__closure__[0].cell_contents)
def line_conf(a, b): def line(x): return ax + b return line line1 = line_conf(1, 1) line2 = line_conf(4, 5) print(line1(5), line2(5))
Fermetures et opérations parallèles
L'informatique parallèle est en train de devenir un point chaud. C’est également une raison importante pour laquelle la programmation fonctionnelle redevient populaire. La programmation fonctionnelle existait dès les années 1950, mais elle n’était pas largement utilisée. Cependant, le processus de clustering parallèle en pipeline que nous avons décrit ci-dessus est parfaitement adapté à la programmation fonctionnelle. En raison des avantages naturels de la programmation fonctionnelle, de plus en plus de langages ont commencé à ajouter la prise en charge du paradigme de programmation fonctionnelle.
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!