Python (école d'ingénieur) · Chapitre 4 · Exercice
Variable non locale (nonlocal)
Fonctions et modularité
Énoncé
Écrire une fonction fabrique_compteur() qui contient une variable locale compteur et une fonction imbriquée incrementer(). Cette fonction imbriquée doit pouvoir modifier la variable compteur de la fonction englobante. Utiliser le mot-clé nonlocal.
Corrigé
Voici l'implémentation utilisant une clôture :
def fabrique_compteur():
"""Retourne une fonction qui incrémente et retourne un compteur."""
compteur = 0
def incrementer():
nonlocal compteur # Permet de modifier la variable de la fonction englobante
compteur += 1
return compteur
return incrementer
# Création de deux compteurs indépendants
compteur1 = fabrique_compteur()
compteur2 = fabrique_compteur()
print(compteur1()) # 1
print(compteur1()) # 2
print(compteur2()) # 1 (indépendant)
print(compteur1()) # 3
print(compteur2()) # 2
Le mot-clé nonlocal est l'équivalent de global mais pour les variables de la portée englobante (enclosing scope). Sans nonlocal, l'affectation compteur += 1 créerait une variable locale compteur dans incrementer() au lieu de modifier celle de fabrique_compteur().
Cette technique (clôture) est une alternative élégante aux variables globales pour créer des états persistants et encapsulés.
100 % gratuit
La suite du chapitre est sur Adloun
- 7 autres exercices corrigés dans ce chapitre, et 7 à chercher avec le tuteur
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.