Closure i Python

Med closure (closure) menas en funktion tillsammans med alla externa variabler som är tillgängliga för den.

I Python, när man säger "funktions closure", menar man oftast inte själva funktionen, utan just dess externa variabler.

Låt oss säga att vi har följande funktion outer, där variabeln i är deklarerad och en inre funktion inner. I den kommer i att ökas med ett. För att variabeln i ska fungera korrekt, lägger vi till satsen nonlocal:

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

Låt oss nu sätta den yttre funktionen i variabeln res och anropa den med runda parenteser:

pythonres = outer()
res() # skriver ut 1

Låt oss anropa res flera gånger. Efter att koden har körts kommer räknaren i att ökas med ett varje gång:

pythonres() # skriver ut 2
res() # skriver ut 3
res() # skriver ut 4

Men det finns en viktig nyans här - varje anrop till funktionen outer kommer att öka sin egen räknare. Låt oss sätta det första anropet till outer i variabeln res1, och det andra anropet - i variabeln res2. Sedan skriver vi ut dem i konsolen sekventiellt:

pythonres1 = outer()
res1() # skriver ut 1
res1() # skriver ut 2
res1() # skriver ut 3

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

Följande kod ges:

pythondef outer():
  i = 10

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

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

Säg vad som skrivs ut i konsolen.

Задание 2

Skapa en funktion, där varje anrop ger nästa Fibonacci-tal.

Задание 3

Skapa en funktion som ger ett slumpmässigt heltal i ett intervall, men så att samma tal inte förekommer två gånger i rad.