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:
def 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:
res = 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:
res() # 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:
res1 = 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
Adott a következő kód:
def 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.
Készítsen egy függvényt, amely minden hívásakor kiírja a következő Fibonacci-számot.
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.