Fermetures en Python

Par fermeture (closure) on entend une fonction ainsi que toutes les variables externes qui lui sont accessibles.

En Python, le plus souvent, en disant "fermeture d'une fonction", on ne désigne pas la fonction elle-même, mais précisément ses variables externes.

Supposons que nous ayons la fonction outer suivante, dans laquelle est déclarée une variable i et une fonction interne inner. Dans celle-ci, on ajoutera un à i. Pour que la variable i fonctionne correctement, ajoutons l'instruction nonlocal :

pythondef outer():
  i = 0
  def inner():
    nonlocal i
    i += 1
    print(i)
  
  return inner

Maintenant, plaçons la fonction externe dans la variable res et appelons-la avec des parenthèses :

pythonres = outer()
res() # affichera 1

Appelons res plusieurs fois. Après l'exécution du code, le compteur i augmentera de un à chaque fois :

pythonres() # affichera 2
res() # affichera 3
res() # affichera 4

Cependant, il y a une nuance importante ici - chaque appel de la fonction outer augmentera son propre compteur. Enregistrons le premier appel de outer dans la variable res1, et le deuxième appel - dans la variable res2. Ensuite, affichons-les successivement dans la console :

pythonres1 = outer()
res1() # affichera 1
res1() # affichera 2
res1() # affichera 3

res2 = outer()
res2() # affichera 1
res2() # affichera 2
res2() # affichera 3
Задание 1

Voici le code suivant :

pythondef outer():
  i = 10

  def inner():
    nonlocal i
    i -= 2
    print(i)
  return inner
  
res1 = outer()
res1()
res1()

res2 = outer()
res2()
res2()
res2()

Dites ce qui sera affiché dans la console.

Задание 2

Créez une fonction dont chaque appel renverra le nombre de Fibonacci suivant.

Задание 3

Créez une fonction qui renverra un nombre entier aléatoire dans un intervalle, mais de telle sorte qu'il n'y ait pas deux fois le même nombre consécutivement.