Fonctions imbriquées en Python

Une fonction imbriquée est simplement une fonction dans une autre fonction, et est parfois appelée «fonction interne». Il existe de nombreuses raisons pour lesquelles vous voudriez utiliser des fonctions imbriquées, et nous allons passer en revue les plus courantes dans cet article.

Comment définir une fonction imbriquée

Pour définir une fonction imbriquée, initialisez simplement une autre fonction dans une fonction en utilisant le defmot - clé:

def greeting(first, last): # nested helper function def getFullName(): return first + " " + last print("Hi, " + getFullName() + "!") greeting('Quincy', 'Larson')

Production:

Hi, Quincy Larson!

Comme vous pouvez le voir, la getFullNamefonction imbriquée a accès aux greetingparamètres de la fonction externe , firstet last. C'est un cas d'utilisation courant pour les fonctions imbriquées - pour servir de petite fonction d'aide à une fonction externe plus complexe.

Raisons d'utiliser des fonctions imbriquées

Bien qu'il existe de nombreuses raisons valables d'utiliser des fonctions imbriquées, les plus courantes sont l'encapsulation et les fermetures / fonctions d'usine.

Encapsulation des données

Il y a des moments où vous souhaitez empêcher une fonction ou les données auxquelles elle a accès d'être accédées à partir d'autres parties de votre code, afin que vous puissiez l' encapsuler dans une autre fonction.

Lorsque vous imbriquez une fonction comme celle-ci, elle est masquée de la portée globale. En raison de ce comportement, l'encapsulation des données est parfois appelée masquage des données ou confidentialité des données . Par exemple:

def outer(): print("I'm the outer function.") def inner(): print("And I'm the inner function.") inner() inner()

Production:

Traceback (most recent call last): File "main.py", line 16, in  inner() NameError: name 'inner' is not defined

Dans le code ci-dessus, la innerfonction n'est disponible qu'à partir de la fonction outer. Si vous essayez d'appeler innerdepuis l'extérieur de la fonction, vous obtiendrez l'erreur ci-dessus.

Au lieu de cela, vous devez appeler la outerfonction comme ceci:

def outer(): print("I'm the outer function.") def inner(): print("And I'm the inner function.") inner() outer()

Production:

I'm the outer function. And I'm the inner function.

Fermetures

Mais que se passerait-il si la fonction externe renvoie la fonction interne elle-même, plutôt que de l'appeler comme dans l'exemple ci-dessus? Dans ce cas, vous auriez ce qu'on appelle une fermeture.

Voici les conditions qui doivent être remplies pour créer une fermeture en Python:

Voici les conditions dont vous avez besoin pour créer une fermeture en Python:

1. Il doit y avoir une fonction imbriquée

2. La fonction interne doit faire référence à une valeur définie dans la portée englobante

3. La fonction englobante doit renvoyer la fonction imbriquée

- Source: //stackabuse.com/python-nested-functions/

Voici un exemple simple de fermeture:

def num1(x): def num2(y): return x + y return num2 print(num1(10)(5))

Production:

15

Les fermetures permettent de passer des données à des fonctions internes sans les passer d'abord à des fonctions externes avec des paramètres comme l' greetingexemple au début de l'article. Ils permettent également d'invoquer la fonction interne depuis l'extérieur de la fonction externe d'encapsulation. Tout cela avec l'avantage de l'encapsulation / masquage des données mentionné précédemment.

Maintenant que vous comprenez comment et pourquoi imbriquer des fonctions en Python, sortez-les et emboitez-les avec le meilleur d'entre eux.