Клопкунии дар Python
Клопкунӣ (closure) функсиеро бо ҳамаи тағирёбандаҳои беруна, ки барои он дастрасанд, дар назар дорад.
Дар Python, аксаран, вақте ки мегӯянд "клопкунии функсия", на худи он функсияро, балки айнан тағирёбандаҳои берунии онро дар назар доранд.
Бигзор мо функсияи зерини outer-ро дошта бошем,
дар он тағирёбандаи i ва функсияи дохилии inner эълон шудааст. Дар он ба i як воҳид илова карда мешавад. Барои он ки тағирёбандаи i дуруст кор кунад, дастури nonlocal-ро ба он илова мекунем:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
Акнун биёед функсияи беруниро дар тағирёбандаи res гузорем ва онро бо қавсҳои гирд фаро кунем:
res = outer()
res() # 1-ро чоп мекунад
Биёед res-ро чанд бор фаро кунем.
Пас аз иҷрои рамз, ҳар дафъа шуморкунандаи i як воҳид зиёд мешавад:
res() # 2-ро чоп мекунад
res() # 3-ро чоп мекунад
res() # 4-ро чоп мекунад
Аммо дар ин ҷо нуқтаи муҳиме мавҷуд аст - ҳар даъвати функсияи outer шуморкунандаи худро зиёд мекунад. Биёед даъвати якуми outer-ро дар тағирёбандаи res1 сабт кунем, ва даъвати дуввумро - дар тағирёбандаи res2. Сипас онҳоро ба тартиб дар консол чоп кунем:
res1 = outer()
res1() # 1-ро чоп мекунад
res1() # 2-ро чоп мекунад
res1() # 3-ро чоп мекунад
res2 = outer()
res2() # 1-ро чоп мекунад
res2() # 2-ро чоп мекунад
res2() # 3-ро чоп мекунад
Рамзи зерин дода шудааст:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
Бигӯед, чӣ дар консол чоп мешавад.
Функсияе созед, ки ҳар даъвати он рақами навбатии Фибоначчиро фаро мехонад.
Функсияе созед, ки адади тасодуфии бутунро дар фосила медиҳад, аммо ба тавре ки ду бор пай дар пай якхела набошад.