पायथन क्लोजर: इसका उपयोग कैसे करें और क्यों?

इस ट्यूटोरियल में, आप पायथन क्लोजर के बारे में जानेंगे कि कैसे एक क्लोजर को परिभाषित किया जाए, और किन कारणों से आपको इसका उपयोग करना चाहिए।

एक नेस्टेड फ़ंक्शन में गैर-फोकल चर

क्लोजर क्या है, यह जानने से पहले, हमें पहले यह समझना होगा कि नेस्टेड फंक्शन और नॉनक्लॉक वैरिएबल क्या है।

किसी अन्य फ़ंक्शन के अंदर परिभाषित फ़ंक्शन को नेस्टेड फ़ंक्शन कहा जाता है। नेस्टेड फ़ंक्शंस वैरिएबल स्कोप के चर तक पहुँच सकते हैं।

पायथन में, ये गैर-स्थानीय चर केवल डिफ़ॉल्ट रूप से पढ़े जाते हैं और उन्हें संशोधित करने के लिए हमें उन्हें स्पष्ट रूप से गैर-स्थानीय (गैर-स्थानीय कीवर्ड का उपयोग करके) घोषित करना चाहिए।

निम्नलिखित गैर-स्थानीय चर तक पहुंच वाले नेस्टेड फ़ंक्शन का एक उदाहरण है।

 def print_msg(msg): # This is the outer enclosing function def printer(): # This is the nested function print(msg) printer() # We execute the function # Output: Hello print_msg("Hello")

आउटपुट

 नमस्कार

हम देख सकते हैं कि नेस्टेड printer()फ़ंक्शन एनक्लोजिंग फ़ंक्शन के गैर-स्थानीय संदेश चर का उपयोग करने में सक्षम था।

क्लोजर फंक्शन को परिभाषित करना

उपरोक्त उदाहरण में, यदि फ़ंक्शन की अंतिम पंक्ति फ़ंक्शन को कॉल करने के बजाय print_msg()वापस कर देती है तो क्या होगा printer()? इसका मतलब है कि फ़ंक्शन निम्नानुसार परिभाषित किया गया था:

 def print_msg(msg): # This is the outer enclosing function def printer(): # This is the nested function print(msg) return printer # returns the nested function # Now let's try calling this function. # Output: Hello another = print_msg("Hello") another()

आउटपुट

 नमस्कार

यह असामान्य है।

print_msg()समारोह तार के साथ बुलाया गया था "Hello"और वापस आ समारोह नाम एक और करने के लिए बाध्य किया गया था। कॉल करने पर another(), संदेश को अभी भी याद किया गया था, हालांकि हमने पहले ही print_msg()फ़ंक्शन निष्पादित करना समाप्त कर दिया था ।

यह तकनीक जिसके द्वारा कुछ डेटा ( "Helloइस मामले में) कोड से जुड़ जाता है उसे पायथन में बंद करना कहा जाता है ।

एन्कोडिंग स्कोप में यह मान तब भी याद किया जाता है जब चर दायरे से बाहर हो जाता है या फ़ंक्शन स्वयं को वर्तमान नामस्थान से हटा दिया जाता है।

आउटपुट देखने के लिए पायथन शेल में निम्नलिखित को चलाने का प्रयास करें।

 >>> del print_msg >>> another() Hello >>> print_msg("Hello") Traceback (most recent call last):… NameError: name 'print_msg' is not defined

यहां, मूल फ़ंक्शन हटाए जाने पर भी दिया गया फ़ंक्शन अभी भी काम करता है।

हमारे पास कब बंद हैं?

जैसा कि उपरोक्त उदाहरण से देखा गया है, हमारे पास पायथन में एक बंद है जब एक नेस्टेड फ़ंक्शन इसके संलग्न दायरे में एक मूल्य का संदर्भ देता है।

पायथन में क्लोजर बनाने के लिए जो मानदंड पूरे होने चाहिए, उन्हें निम्नलिखित बिंदुओं में संक्षेपित किया गया है।

  • हमारे पास एक नेस्टेड फ़ंक्शन (फ़ंक्शन के अंदर फ़ंक्शन) होना चाहिए।
  • नेस्टेड फ़ंक्शन को एनक्लोज़िंग फ़ंक्शन में परिभाषित मूल्य का उल्लेख करना चाहिए।
  • संलग्नक फ़ंक्शन नेस्टेड फ़ंक्शन को वापस करना चाहिए।

क्लोजर का उपयोग कब करें?

तो क्या बंद करने के लिए अच्छे हैं?

क्लोजर वैश्विक मूल्यों के उपयोग से बच सकते हैं और डेटा छिपाने के कुछ रूप प्रदान करते हैं। यह समस्या का एक वस्तु उन्मुख समाधान भी प्रदान कर सकता है।

जब कुछ विधियां (अधिकांश मामलों में एक विधि) एक कक्षा में लागू की जाती हैं, तो क्लोजर एक वैकल्पिक और अधिक सुरुचिपूर्ण समाधान प्रदान कर सकते हैं। लेकिन जब विशेषताओं और तरीकों की संख्या बड़ी हो जाती है, तो कक्षा को लागू करना बेहतर होता है।

यहां एक सरल उदाहरण है जहां एक बंद एक वर्ग को परिभाषित करने और वस्तुओं को बनाने की तुलना में अधिक बेहतर हो सकता है। लेकिन वरीयता आपकी ही है।

 def make_multiplier_of(n): def multiplier(x): return x * n return multiplier # Multiplier of 3 times3 = make_multiplier_of(3) # Multiplier of 5 times5 = make_multiplier_of(5) # Output: 27 print(times3(9)) # Output: 15 print(times5(3)) # Output: 30 print(times5(times3(2)))

आउटपुट

 २ १५ ३०

पायथन डेकोरेटर्स क्लोजर का भी व्यापक उपयोग करते हैं।

एक समापन नोट पर, यह इंगित करना अच्छा है कि क्लोजर फ़ंक्शन में संलग्न होने वाले मूल्यों का पता लगाया जा सकता है।

सभी फ़ंक्शन ऑब्जेक्ट में एक __closure__विशेषता होती है जो एक बंद फ़ंक्शन होने पर सेल ऑब्जेक्ट का एक टपल लौटाता है। उपरोक्त उदाहरण का उल्लेख करते हुए, हम जानते हैं times3और times5क्लोजर फ़ंक्शन हैं।

 >>> make_multiplier_of.__closure__ >>> times3.__closure__ (,)

सेल ऑब्जेक्ट में विशेषता cell_contents है जो बंद मूल्य को संग्रहीत करता है।

 >>> times3.__closure__(0).cell_contents 3 >>> times5.__closure__(0).cell_contents 5

दिलचस्प लेख...