Kufunga kwa Python
Kufunga (closure) hurejelea kazi pamoja na vigezo vyote vya nje vinavyopatikana kwake.
Katika Python mara nyingi, wakati wakisema "kufunga kwa kazi", hamaanishi kazi yenyewe, bali hasa vigezo vyake vya nje.
Tuchukulie tuna kazi ifuatayo outer,
ambayo imetangazwa kigezo i na
kazi ya ndani inner. Ndani yake
i itaongezewa moja. Ili
kigezo i kifanye kazi vizuri,
tunaongeza agizo nonlocal:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
Sasa tuweke kazi ya nje kwenye
kigezo res na tuiite kwa
mabano ya duara:
res = outer()
res() # itatoa 1
Wacha tuite res mara kadhaa.
Baada ya kutekeleza msimbo kila wakati
kihesabu i kitaongezeka kwa moja:
res() # itatoa 2
res() # itatoa 3
res() # itatoa 4
Hata hivyo kuna undani muhimu hapa - kila
utendaji wa kazi outer utaongeza
kihesabu chake. Wacha utendaji wa kwanza wa outer
uuandikwe kwenye kigezo res1, na utendaji wa pili
- kwenye kigezo res2. Kisha
tuyaonyeshe mfululizo kwenye konsoli:
res1 = outer()
res1() # itatoa 1
res1() # itatoa 2
res1() # itatoa 3
res2 = outer()
res2() # itatoa 1
res2() # itatoa 2
res2() # itatoa 3
Kuna msimbo ufuatao:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
Waambie, nini kitaonyeshwa kwenye konsoli.
Tengeneza kazi, ambayo kila utendaji wake utatoa nambari inayofuata ya Fibonacci.
Tengeneza kazi, ambayo itatoa nambari kamili ya nasibu katika kipindi, lakini ili isiwe na nambari sawa mara mbili mfululizo.