पायथन में क्लोजर
क्लोजर (closure) से तात्पर्य एक फ़ंक्शन के साथ-साथ उन सभी बाहरी वेरिएबल्स से है जो उसके लिए एक्सेसिबल हैं।
पायथन में, अक्सर "फ़ंक्शन क्लोजर" कहने पर, स्वयं फ़ंक्शन को नहीं, बल्कि उसके बाहरी वेरिएबल्स को ही संदर्भित किया जाता है।
मान लीजिए कि हमारे पास निम्नलिखित फ़ंक्शन 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()
बताएं कि कंसोल में क्या प्रिंट होगा।
एक ऐसा फ़ंक्शन बनाएं, जिसका हर कॉल अगला फाइबोनैचि संख्या उत्पन्न करे।
एक ऐसा फ़ंक्शन बनाएं, जो एक रेंज में रैंडम इंटीजर नंबर दे, लेकिन ऐसा कि लगातार दो बार एक ही नंबर न आए।