Sluitings in Python

Met 'n sluiting (closure) word 'n funksie bedoel tesame met al die eksterne veranderlikes wat daarvoor toeganklik is.

In Python, as hulle sê "sluiting van 'n funksie", bedoel hulle meestal nie die funksie self nie, maar juis sy eksterne veranderlikes.

Kom ons neem die volgende funksie outer, waarin die veranderlike i gedeclareer is en 'n innerlike funksie inner. Daarin sal by i een bygetel word. Sodat die veranderlike i korrek werk, voeg ons die instruksie nonlocal by:

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

  return inner

Laat ons nou die eksterne funksie in die veranderlike res plaas en dit roep met ronde hakies:

pythonres = outer()
res() # sal 1 uitdruk

Laat ons res 'n paar keer roep. Na die uitvoering van die kode sal die teller i elke keer met een vermeerder:

pythonres() # sal 2 uitdruk
res() # sal 3 uitdruk
res() # sal 4 uitdruk

Daar is egter 'n belangrike nuans - elke roep van die funksie outer sal sy eie teller vermeerder. Laat ons die eerste roep van outer in die veranderlike res1 skryf, en die tweede roep - in die veranderlike res2. Dan druk ons hulle opeenvolgend in die konsole uit:

pythonres1 = outer()
res1() # sal 1 uitdruk
res1() # sal 2 uitdruk
res1() # sal 3 uitdruk

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

Die volgende kode word gegee:

pythondef outer():
  i = 10

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

res1 = outer()
res1()
res1()

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

Sê wat in die konsole uitgedruk sal word.

Задание 2

Maak 'n funksie waarvan elke roep die volgende Fibonacci-getal sal gee.

Задание 3

Maak 'n funksie wat 'n ewekansige heelgetal in 'n reeks sal gee, maar sodat daar nie twee keer agtereenvolgens dieselfde een is nie.