Lukking i Python

Med lukking (closure) mener man en funksjon sammen med alle de eksterne variablene som er tilgjengelige for den.

I Python, når man sier "funksjonslukking", mener man som oftest ikke selve funksjonen, men nettopp dens eksterne variabler.

La oss si at vi har følgende funksjon outer, der variabelen i er deklarert og en indre funksjon inner. I den vil i bli økt med én. For at variabelen i skal fungere korrekt, legger vi til setningen nonlocal:

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

La oss nå legge den ytre funksjonen i variabelen res og kalle den med parenteser:

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

La oss kalle res flere ganger. Etter kjøring av koden vil telleren i økes med én hver gang:

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

Det er imidlertid en viktig nyanse her - hvert kall til funksjonen outer vil øke sin egen teller. La oss skrive det første kallet til outer i variabelen res1, og det andre kallet - i variabelen res2. Deretter skriver vi dem sekvensielt til konsollen:

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ølgende kode er gitt:

pythondef outer():
  i = 10

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

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

Si hva som skrives ut i konsollen.

Задание 2

Lag en funksjon hvor hvert kall vil gi det neste Fibonacci-tallet.

Задание 3

Lag en funksjon som gir et tilfeldig heltall i et intervall, men slik at det ikke er det samme to ganger på rad.