पायथन में क्लोजर

क्लोजर (closure) से तात्पर्य एक फ़ंक्शन के साथ-साथ उन सभी बाहरी वेरिएबल्स से है जो उसके लिए एक्सेसिबल हैं।

पायथन में, अक्सर "फ़ंक्शन क्लोजर" कहने पर, स्वयं फ़ंक्शन को नहीं, बल्कि उसके बाहरी वेरिएबल्स को ही संदर्भित किया जाता है।

मान लीजिए कि हमारे पास निम्नलिखित फ़ंक्शन outer है, जिसमें वेरिएबल i और आंतरिक फ़ंक्शन inner घोषित है। इसमें i में एक जोड़ा जाएगा। वेरिएबल i को सही ढंग से काम कराने के लिए, हम इसमें nonlocal इंस्ट्रक्शन जोड़ते हैं:

pythondef outer():
  i = 0
  def inner():
    nonlocal i
    i += 1
    print(i)
  
  return inner

अब बाहरी फ़ंक्शन को वेरिएबल res में रखते हैं और इसे कोष्ठकों के साथ कॉल करते हैं:

pythonres = outer()
res() # 1 प्रिंट करेगा

आइए res को कई बार कॉल करते हैं। कोड निष्पादित होने के बाद काउंटर i हर बार एक से बढ़ जाएगा:

pythonres() # 2 प्रिंट करेगा
res() # 3 प्रिंट करेगा
res() # 4 प्रिंट करेगा

हालाँकि, यहाँ एक महत्वपूर्ण बारीकियाँ है - फ़ंक्शन outer का हर कॉल अपना काउंटर बढ़ाएगा। आइए पहले कॉल outer को वेरिएबल res1 में और दूसरे कॉल को वेरिएबल res2 में रिकॉर्ड करते हैं। फिर उन्हें क्रमिक रूप से कंसोल में प्रिंट करते हैं:

pythonres1 = outer()
res1() # 1 प्रिंट करेगा
res1() # 2 प्रिंट करेगा
res1() # 3 प्रिंट करेगा

res2 = outer()
res2() # 1 प्रिंट करेगा
res2() # 2 प्रिंट करेगा
res2() # 3 प्रिंट करेगा
Задание 1

निम्नलिखित कोड दिया गया है:

pythondef outer():
  i = 10

  def inner():
    nonlocal i
    i -= 2
    print(i)
  return inner
  
res1 = outer()
res1()
res1()

res2 = outer()
res2()
res2()
res2()

बताएं कि कंसोल में क्या प्रिंट होगा।

Задание 2

एक ऐसा फ़ंक्शन बनाएं, जिसका हर कॉल अगला फाइबोनैचि संख्या उत्पन्न करे।

Задание 3

एक ऐसा फ़ंक्शन बनाएं, जो एक रेंज में रैंडम इंटीजर नंबर दे, लेकिन ऐसा कि लगातार दो बार एक ही नंबर न आए।