Zárások a Pythonban

A zárással (closure) olyan függvényt értünk, amely hozzáfér mindegyik külső változójához.

A Pythonban leggyakrabban, amikor egy függvény "zárásáról" beszélünk, nem magára a függvényre gondolunk, hanem pontosan a külső változóira.

Tegyük fel, hogy van egy outer függvényünk, amelyben deklarálunk egy i változót és egy belső inner függvényt. Ebben hozzáadunk egyet a i változóhoz. Ahhoz, hogy a i változó megfelelően működjön, hozzáadjuk a nonlocal utasítást:

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

Most tegyük a külső függvényt egy res változóba, és hívjuk meg kerek zárójelekkel:

pythonres = outer()
res() # kiírja az 1-et

Hívjuk meg a res-t többször is. A kód végrehajtása után minden alkalommal a számláló i eggyel növekszik:

pythonres() # kiírja a 2-t
res() # kiírja a 3-at
res() # kiírja a 4-et

Itt azonban van egy fontos árnyalat - minden egyes outer függvényhívás a saját számlálóját növeli. Az első outer hívást tegyük a res1 változóba, a második hívást pedig a res2 változóba. Ezután írassuk ki őket sorban a konzolra:

pythonres1 = outer()
res1() # kiírja az 1-et
res1() # kiírja a 2-t
res1() # kiírja a 3-at

res2 = outer()
res2() # kiírja az 1-et
res2() # kiírja a 2-t
res2() # kiírja a 3-at
Задание 1

Adott a következő kód:

pythondef outer():
  i = 10

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

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

Mondja meg, mi jelenik meg a konzolon.

Задание 2

Készítsen egy függvényt, amely minden hívásakor kiírja a következő Fibonacci-számot.

Задание 3

Készítsen egy függvényt, amely egy intervallumon belül ad vissza véletlen egész számot, úgy, hogy egymás után kétszer ne legyen ugyanaz.