Closures i Python

Med closure (closure) forstås en funktion sammen med alle de eksterne variable, der er tilgængelige for den.

I Python, når man siger "funktionsclosure", mener man som oftest ikke selve funktionen, men netop dens eksterne variable.

Lad os sige, at vi har følgende funktion outer, hvor variablen i er erklæret og en indre funktion inner. I den vil i blive øget med en. For at variablen i skal fungere korrekt, tilføjer vi instruktionen nonlocal til den:

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

Lad os nu putte den ydre funktion i variablen res og kalde den med parenteser:

pythonres = outer()
res() # udskriver 1

Lad os kalde res flere gange. Efter udførelse af koden hver gang vil tælleren i blive øget med en:

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

Men der er en vigtig nuance her - hvert kald af funktionen outer vil øge sin egen tæller. Lad os skrive det første kald af outer i variablen res1, og det andet kald - i variablen res2. Derefter udskriver vi dem sekventielt i konsollen:

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

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

Følgende kode er givet:

pythondef outer():
  i = 10

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

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

Sig, hvad der udskrives i konsollen.

Задание 2

Lav en funktion, hvor hvert kald vil returnere det næste Fibonacci-tal.

Задание 3

Lav en funktion, der returnerer et tilfældigt heltal i et interval, men således at der ikke forekommer to ens tal i træk.