Fonctions imbriquées en Python
Une fonction est un bloc de code qui peut être appelé encore et encore dans un programme. Il peut accepter différents arguments et peut renvoyer une valeur utile. Dans tous les langages de programmation, nous avons des fonctions intégrées et des fonctions définies par l’utilisateur.
Dans ce tutoriel, nous allons apprendre à créer et utiliser des fonctions imbriquées en Python.
La plupart des langages prennent en charge l’utilisation et la création de fonctions imbriquées. Comme son nom l’indique, une fonction imbriquée est une fonction dans une fonction. La fonction imbriquée à l’intérieur est appelée fonction interne et la fonction englobante est appelée fonction externe.
Dans le code suivant, nous créons une fonction imbriquée de base.
def outer_f(s):
def inner_f(s):
print(s)
inner_f(s)
outer_f("Nested")
Production:
Nested
En utilisant l’exemple ci-dessus, nous pouvons avoir une petite idée sur l’utilisation des fonctions imbriquées. Ils peuvent être utilisés pour masquer une fonction du monde extérieur et implémenter l’encapsulation de données.
Une autre chose à savoir est que la fonction imbriquée peut utiliser la variable utilisée dans la fonction externe. De telles variables sont dites non locales. Les fonctions imbriquées peuvent y accéder, mais si nous devons les modifier, nous devons utiliser le mot-clé nonlocal
.
Voyons l’exemple suivant.
def outer_f():
s = 5
def inner_f():
nonlocal s
s = s + 1
return s
return inner_f()
print(outer_f())
Production:
6
Ici, nous ne serions pas en mesure de modifier la variable s
sans utiliser le mot-clé nonlocal
.
Imaginez maintenant si la fonction imbriquée renvoie une valeur. Cela nous amène à une autre fonctionnalité utile des fonctions imbriquées, à savoir les fonctions de fermeture. Ces fonctions sont créées dynamiquement à l’aide de fonctions imbriquées. Cela peut être un moyen élégant et concis d’implémenter le masquage des données et de l’utiliser comme alternative aux classes.
Voir le code suivant.
def incrementer(x):
def inc(y):
return x + y
return inc
by4 = incrementer(4)
by5 = incrementer(5)
print(by4(5), by5(5))
Production:
9 10
Maintenant, dans le code ci-dessus, nous créons une méthode dynamique pour incrémenter un nombre. Le by4
et by5
sont les deux fonctions de fermeture créées à l’aide de la fonction imbriquée. Ceci est principalement dû à la capacité des fonctions imbriquées à conserver leur état. Cela peut être une alternative décente aux classes et aux variables globales lorsque peu d’attributs sont impliqués. Nous pouvons savoir si une fonction est une fermeture en utilisant l’attribut __closure__
. Toutes les fonctions ont cet attribut et renvoient des objets de cellule lorsqu’elles sont utilisées avec une fonction de fermeture.
Les fonctions imbriquées sont également utilisées pour les fonctions de décorateur. Les fonctions de décoration utilisent un objet appelable comme une classe, une fonction et renvoient un autre objet. Nous utilisons le signe @
pour utiliser un décorateur avant un tel objet appelable. De cette façon, nous prenons l’objet appelable comme argument de la fonction décoratrice et l’utilisons.
Nous créons une fonction de décorateur très simple pour mieux comprendre cela dans l’exemple suivant.
def dec(func):
def inner():
print("Hello")
func()
return inner
@dec
def world():
print("world")
world()
Production:
Hello
world
Dans l’exemple ci-dessus, nous avons créé une fonction de décoration simple appelée dec()
, qui décore la fonction world()
en l’utilisant comme argument et en affichant un message supplémentaire.
Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.
LinkedIn