Zaprtja v Pythonu
Z zaprtjem (closure) razumemo funkcijo skupaj z vsemi zunanjimi spremenljivkami, ki so ji dostopne.
V Pythonu običajno, ko rečejo "zaprtje funkcije", ne mislijo na samo funkcijo, ampak ravno na njene zunanje spremenljivke.
Recimo, da imamo naslednjo funkcijo outer,
v kateri je deklarirana spremenljivka i in
notranja funkcija inner. V njej se bo
k i prištevala ena. Da bi
spremenljivka i pravilno delovala,
dodamo k njej stavek nonlocal:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
Zdaj pa dajmo zunanjo funkcijo v
spremenljivko res in jo pokličimo z
okroglimi oklepaji:
res = outer()
res() # izpiše 1
Pokličimo res večkrat.
Po izvedbi koda bo števec
i vsakič narasel za ena:
res() # izpiše 2
res() # izpiše 3
res() # izpiše 4
Vendar pa je tu pomemben odtenek - vsak
klic funkcije outer bo povečal
svoj števec. Naj bo prvi klic outer
zapisan v spremenljivko res1, drugi
klic pa v spremenljivko res2. Nato
zaporedoma izpišimo njihove vrednosti v konzolo:
res1 = outer()
res1() # izpiše 1
res1() # izpiše 2
res1() # izpiše 3
res2 = outer()
res2() # izpiše 1
res2() # izpiše 2
res2() # izpiše 3
Podana je naslednja koda:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
Povejte, kaj se bo izpisalo v konzolo.
Naredite funkcijo, katere vsak klic bo vrnil naslednje Fibonaccijevo število.
Naredite funkcijo, ki bo vračala naključno celo število v danem intervalu, vendar tako, da zaporedoma ne bo dveh enakih.