Comment utiliser des fonctions imbriquées dans Python

Comment utiliser des fonctions imbriquées dans Python
Cet article couvrira un guide sur l'utilisation des fonctions imbriquées dans Python. Les fonctions imbriquées ou les fonctions intérieures sont définies à l'intérieur d'autres fonctions Python. Ils sont utiles dans certains modèles de programmation et les cas d'utilisation. Certains d'entre eux seront expliqués dans cet article. Tous les échantillons de code de cet article sont testés avec Python 3.9.5 sur Ubuntu 21.04.

Sur les fonctions imbriquées / intérieures

Les fonctions imbriquées, comme leur nom l'indique, sont des fonctions Python qui sont créées à l'intérieur d'autres fonctions Python. Outre sa propre portée, la fonction intérieure a accès aux objets disponibles dans la portée de la fonction extérieure. La fonction intérieure peut être appelée un seul objet Python avec ses propres données et variables. Cette fonction intérieure est protégée par la fonction extérieure et ne peut pas être appelée ou référée de la portée globale. De cette façon, la fonction intérieure agit comme une entité cachée qui fonctionne uniquement dans les limites de la fonction extérieure et la portée globale reste inconscient. Ce processus est également connu sous le nom de «encapsulation» dans la programmation. Voici un exemple de fonction imbriquée à Python.

def visibile_outer_function (nom):
def Hidden_inner_Function ():
imprimer (nom)
Hidden_inner_function ()
visibile_outer_function ("John")
Hidden_inner_function ()

La fonction extérieure prend un argument obligatoire appelé «nom». La fonction intérieure a accès à la portée de la fonction extérieure afin qu'il puisse utiliser la variable de nom. Un appel à la fonction intérieure est ensuite fait dans la fonction extérieure. Ensuite, un appel aux fonctions intérieures et extérieures est effectuée dans la portée globale. Après avoir exécuté l'échantillon de code ci-dessus, vous devriez obtenir la sortie suivante:

John
Traceback (dernier appel dernier):
Fichier "principal.py ", ligne 9, dans
Hidden_inner_function ()
NameError: le nom 'Hidden_inner_function' n'est pas défini

Comme vous pouvez le voir dans la sortie, la fonction extérieure fonctionne bien lorsque vous l'appelez à partir de la portée globale. Une erreur est lancée lorsque vous essayez d'appeler la fonction intérieure car aucune telle chose n'est disponible dans la portée globale.

Fonctions intérieures des cas d'utilisation

Maintenant que vous avez une certaine compréhension des fonctions imbriquées, vous vous demandez peut-être leur utilité et quand les utiliser. L'une des utilisations les plus courantes des fonctions internes est de créer des fonctions d'assistance dans la fonction principale. Les fonctions intérieures peuvent également être utilisées comme décorateurs et peuvent être utilisées pour mettre en œuvre des fermetures dans votre programme. Ces cas d'utilisation sont expliqués ci-dessous avec des exemples.

Création d'une fonction d'assistance

Les fonctions d'assistance sont comme toutes les autres fonctions Python, mais elles sont appelées fonctions «auxiliaires» car elles peuvent aider à mieux organiser le code complexe et peuvent être réutilisés n'importe quel nombre de fois pour éviter la répétition du code. Vous trouverez ci-dessous un échantillon de code qui illustre une fonction d'assistance interne.

def get_ticket_price (nom):
membres = ["Tony", "Peter", "Mark"]
prix = 10
def get_discounted_price (remise = 1.0)::
retour (prix * réduction)
Si le nom des membres:
ticket_price = get_discounted_price (remise = 0.50)
autre:
ticket_price = get_discounted_price ()
Imprimer ("prix du billet pour" + nom + "est: $" + str (ticket_price))
get_ticket_price ("Tony")
get_ticket_price ("John")

La fonction extérieure appelée principale est "get_ticket_price". Il prend le nom d'une personne comme argument obligatoire. La fonction «get_discounted_price» est une fonction d'assistance intérieure qui prend la «remise» comme argument facultatif. La liste «membres» contient les noms de tous les membres enregistrés qui sont éligibles à une remise. Un prix réduit pour les membres est calculé en appelant la fonction intérieure et en lui fournissant une valeur de réduction comme argument. Cette fonction d'assistance peut être appelée plusieurs fois en fonction des exigences et vous pouvez également modifier la logique dans la fonction interne. Ainsi, les fonctions d'assistance interne vous permettent de simplifier le code et d'éviter les répétitions inutiles. Après avoir exécuté l'échantillon de code ci-dessus, vous devriez obtenir la sortie suivante:

Le prix du billet pour Tony est: 5 $.0
Le prix du billet pour John est: 10 $.0

Comme vous pouvez le voir dans la production ci-dessus, Tony obtient une remise sur le prix du billet car il est dans la liste des membres.

Mise en œuvre des fermetures

Les fermetures sont des cas de fonctions internes qui sont renvoyées par des fonctions extérieures. Ces fonctions intérieures ont accès à la portée des fonctions extérieures et ils continuent d'avoir accès à l'étendue de la fonction extérieure même après que la fonction extérieure a cessé d'exécuter. Jetez un œil à l'échantillon de code ci-dessous:

def get_discounted_price (prix):
Def Discouted_price (remise):
Prix ​​de retour * Remise
Retour à prix réduit
first_discount = get_discounted_price (10)
second_discount = get_discounted_price (10)
Imprimer (First_Discount (0.50))
Print (Second_Discount (0.60))

La fonction extérieure "get_discounted_price" renvoie une référence à la fonction intérieure appelée "Discouted_price". Notez que dans l'instruction de retour, la fonction est appelée sans accolades. Ensuite, deux nouvelles instances appelées «first_discount» et «second_dicount» sont créées en appelant la fonction extérieure et une valeur pour l'argument «prix» est fourni à ces appels. À ce stade, la fonction extérieure a terminé l'exécution, mais son état a été enregistré dans les objets First_Discount et Second_Discount. Maintenant, lorsque vous appelez les instances First_Discount et Second_Discount avec des accolades et des arguments, ils auront déjà accès à une variable appelée Price avec sa valeur. L'argument fourni à ces instances va maintenant à la fonction intérieure qui renvoie ensuite un résultat.

Après avoir exécuté l'échantillon de code ci-dessus, vous devriez obtenir la sortie suivante:

5.0
6.0

Les fermetures sont généralement utilisées dans les situations où votre programme nécessite de préserver l'état d'une fonction.

Création de fonctions de décoration

Fonctions décoratrices dans Python Modifier le comportement d'une fonction Python existante sans la modifier. Ainsi, lorsque vous attachez un décorateur à une fonction, vous pouvez ajouter des fonctionnalités supplémentaires à la fonction ou modifier son comportement tout en gardant son comportement d'origine intact. Un décorateur de Python typique ressemble à ceci:

@décorateur
Def décoré ():
passer

Ici, «@decorator» modifiera le comportement de la fonction «décorée». Vous pouvez créer des fonctions de décorateur en utilisant des fonctions imbriquées. Pour créer un décorateur, définissez une fonction et passez-la à une fonction extérieure comme un argument. Cette fonction passée est ensuite appelée dans une autre fonction intérieure où vous pouvez l'utiliser et implémenter la logique. Enfin, la fonction extérieure renvoie la fonction intérieure qui contient le comportement modifié. Jetez un œil à l'échantillon de code ci-dessous.

def get_discounted_price (montant):
Def Discouted_price ():
prix = montant ()
new_price = prix * 0.50
retourner new_price
Retour à prix réduit

La fonction extérieure «get_discounted_price» est passé une autre fonction appelée «montant» comme argument. La fonction intérieure utilise la fonction passée et y ajoute un certain comportement. La fonction externe renvoie ensuite une référence à la fonction interne qui contient le comportement modifié. Après avoir défini le décorateur, vous pouvez appeler l'informatique de manière suivante:

@get_discounted_price
def get_price ():
retour 10
print (get_price ())

Les décorateurs sont attachés à des fonctions dont vous essayez de modifier le comportement. Ils commencent toujours par le symbole «@». En utilisant le décorateur ici, vous transmettez la fonction «get_price» à la fonction «get_discounted_price» comme un argument. Maintenant, lorsque vous appelez la fonction get_price, vous n'en obtiendrez pas 10 comme sortie mais un nombre modifié par le décorateur get_discounted_price. Après avoir exécuté l'échantillon de code ci-dessus, vous devriez obtenir la sortie suivante:

5.0

L'utilisation du décorateur ci-dessus est équivalente au code suivant:

def get_discounted_price (montant):
Def Discouted_price ():
prix = montant ()
new_price = prix * 0.50
retourner new_price
Retour à prix réduit
def get_price ():
retour 10
final_price = get_discounted_price (get_price)
print (final_price ())

Au lieu d'utiliser une syntaxe «@decorator» comme raccourci, vous pouvez simplement créer une nouvelle instance de la fonction extérieure et lui fournir une autre fonction comme un argument. Le résultat final des deux modèles de codage est le même. Étant donné que les décorateurs gardent le comportement de la fonction d'origine intacte, ils sont vraiment utiles si vous voulez les appeler au cas par cas et en même temps préserver la mise en œuvre de la vanille d'une fonction décorée.

Conclusion

Vous pouvez utiliser des fonctions imbriquées de diverses manières pour créer des fonctions intérieures qui ajoutent des fonctionnalités et une logique supplémentaires à la fonction extérieure. Certains des cas d'utilisation les plus courants pour les fonctions imbriquées ont été expliqués dans l'article. Vous pouvez également créer vos propres implémentations de fonctions intérieures, car toutes les fonctions sont traitées comme des objets de première classe dans Python et ils peuvent être retournés ou passés comme des arguments.