पायथन में इटरेटर एक महत्वपूर्ण भूमिका निभाते हैं। वे आपको एक ऐसी वस्तु बनाने की अनुमति देते हैं जिस पर पुनरावृति की जा सकती है। यह डेटा को स्टोर करने का एक अच्छा तरीका है जिसे लूप के माध्यम से एक्सेस किया जा सकता है।
इटरेटर्स के साथ समस्या यह है कि इसे बनाने में काफी मेहनत लगती है। वे उपयोगी हैं, लेकिन एक काम करने के लिए आपको बहुत सारे कोड लिखने होंगे। जनरेटर इस समस्या को हल करने में मदद करते हैं।
इस गाइड में, हम इस बारे में बात करने जा रहे हैं कि पायथन जनरेटर क्या हैं और आपको उनका उपयोग क्यों करना चाहिए। हम आपको यह समझने में मदद करने के लिए पायथन में एक जनरेटर भी लागू करेंगे कि वे कैसे काम करते हैं।
आगे की हलचल के बिना, चलिए शुरू करते हैं!
जनरेटर क्या है?
एक जनरेटर पायथन में एक पुनरावर्तक बनाने का एक आसान तरीका है। यह एक ऐसा फ़ंक्शन है जो एक वस्तु देता है जिस पर आप पुनरावृति कर सकते हैं।
जेनरेटर को अक्सर वाक्यात्मक चीनी कहा जाता है। ऐसा इसलिए है क्योंकि वे जरूरी नहीं कि पायथन में नई कार्यक्षमता जोड़ें। वे आपके कोड को अधिक कुशल बनाने में मदद करते हैं।
पुनरावृत्तियों की तरह, आप केवल एक बार जनरेटर पर पुनरावृति कर सकते हैं। ऐसा इसलिए है क्योंकि जनरेटर ट्रैक करते हैं कि उन्हें कितनी बार पुनरावृत्त किया गया है, और उन्हें रीसेट नहीं किया जा सकता है।
आइए एक पायथन इटरेटर पर एक नज़र डालें:
81% प्रतिभागियों ने कहा कि बूटकैंप में भाग लेने के बाद उन्हें अपनी तकनीकी नौकरी की संभावनाओं के बारे में अधिक आत्मविश्वास महसूस हुआ। आज ही एक बूटकैंप से मिलान करें।
बूटकैंप शुरू करने से लेकर अपनी पहली नौकरी खोजने तक, औसत बूटकैंप ग्रेड ने करियर संक्रमण में छह महीने से भी कम समय बिताया।
<पूर्व>वर्ग कुकीज़:def __init__(self, value):self.value =value def __iter__(self):return self def __next__(self):return self.value
यह कोड कुकीज़ नामक एक पुनरावर्तक बनाता है। जब आप इस इटरेटर के माध्यम से डेटा पास करते हैं, तो इसे एक पुनरावृत्त वस्तु में बदल दिया जाएगा। इसका मतलब है कि आप इन लूप का उपयोग करके डेटा के माध्यम से लूप कर सकते हैं। यदि आप इस कोड को देख रहे हैं और सोचते हैं कि यह वास्तव में लंबा है, ऐसा इसलिए है क्योंकि यह है।
जेनरेटर इस कोड को छोटा करने में हमारी मदद कर सकते हैं। आइए हमारे उपरोक्त पुनरावर्तक के लिए एक जनरेटर लिखें:
डिफ कुकीज (वैल्यू):जबकि ट्रू:यील्ड वैल्यू
हमारे कोड का आकार काफी कम कर दिया गया है। आइए चर्चा करें कि यह कैसे काम करता है।
जेनरेटर एक ऐसा फंक्शन है जिसमें रिटर्न स्टेटमेंट के बजाय यील्ड कीवर्ड होता है। यील्ड स्टेटमेंट किसी फ़ंक्शन से एक मान लौटाते हैं।
यील्ड स्टेटमेंट और रिटर्न स्टेटमेंट के बीच का अंतर यह है कि रिटर्न स्टेटमेंट किसी फंक्शन को चलने से रोकता है, जबकि यील्ड स्टेटमेंट फंक्शन को रोक देता है और फिर से जारी रहता है।
आइए हमारे सरल जनरेटर फ़ंक्शन पर पुनरावृति करने का प्रयास करें:
कुकीज़ में कुकी के लिए ("रास्पबेरी"):प्रिंट (कुकी)
हमारा कोड लौटाता है:
रास्पबेरी
रास्पबेरी
…
यह कोड तब तक दोहराता रहता है जब तक हम अपना प्रोग्राम बंद नहीं कर देते। ऐसा इसलिए है क्योंकि हमने while
. का उपयोग किया है लूप जो हमेशा के लिए निष्पादित होता है। यह ज्यादातर मामलों में बहुत उपयोगी नहीं है। आइए एक जनरेटर लिखते हैं जो किसी क्रिया के होने पर रुक जाता है।
पायथन जेनरेटर कैसे लिखें
हमारे पास कुकीज़ की एक सूची है जिसे हम कंसोल पर प्रिंट करना चाहते हैं। यह सूची इस तरह दिखती है:
[“Raspberry”, “Choc-Chip”, “Cinnamon”, “Oat”]
इन्हें कंसोल पर प्रिंट करने के लिए, हम एक साधारण जनरेटर बना सकते हैं। एक नई पायथन फ़ाइल खोलें और निम्नलिखित कोड में पेस्ट करें:
def print_cookies(cookies):length =len(cookies) in कुकी in range(0, length):Yieldookies[cookie]
हमारा जनरेटर हमारे द्वारा निर्दिष्ट सूची में प्रत्येक कुकी के माध्यम से जाता है और प्रत्येक कुकी को अलग-अलग लौटाता है। यह जनरेटर अभी काम नहीं करता है। हमें इस पर पुनरावृति करने के लिए लूप के लिए उपयोग करना होगा:
cookie_list =["रास्पबेरी", "चोक-चिप", "दालचीनी", "ओट"] c के लिए print_cookies(cookie_list) में:प्रिंट (c)
हमने cookie_list
. नामक एक सरणी परिभाषित की है जो चार कुकीज़ की एक सूची संग्रहीत करता है। फिर हमने एक लूप के लिए सेट किया है जो हमारे जनरेटर का उपयोग cookie_list
में मानों के माध्यम से पुनरावृति करने के लिए करता है .
हमारे लूप में प्रत्येक पुनरावृत्ति के लिए, उत्पन्न वस्तु कंसोल पर मुद्रित होती है:
रास्पबेरी
चोक-चिप
दालचीनी
जई
हमने कर दिया! यह जनरेटर वेरिएबल cookie_list
. में प्रत्येक मान तक मान लौटाता है पर पुनरावृति की गई है।
जेनरेटर में उपयोग के मामलों की एक श्रृंखला होती है। मान लें कि हमारे पास ऑर्डर की कीमतों की एक सूची है जिसे हम कुल करना चाहते हैं। हम निम्नलिखित कोड का उपयोग करके ऐसा कर सकते हैं:
def total_orders(orders):length =len(orders) total =0 for o in range(0, length):कुल +=आदेश[o] कुल उपज
यह जनरेटर एक सूची में सभी ऑर्डर के मूल्य का एक रनिंग टोटल रखेगा। प्रत्येक आइटम के पुनरावृत्त होने के बाद, जनरेटर ऑर्डर के वर्तमान कुल मूल्य को प्राप्त करेगा। आइए एक लूप के लिए लिखें जो हमारे जनरेटर का उपयोग करता है:
हमारा कोड लौटाता है:
2.3
4.8पी>
6.75पी>
12.75
20.25पी>
22.4
हमारे जनरेटर ने ऑर्डर_लिस्ट वैरिएबल में सभी ऑर्डर के संचयी मूल्य की गणना की है। सूची में प्रत्येक पुनरावृत्ति नया संचयी मान लौटाता है।
जेनरेटर एक्सप्रेशन कैसे लिखें
एक पुनरावर्तक की तुलना में जेनरेटर लिखना पहले से ही आसान है। क्लीनर कोड लिखने की हमारी खोज को रोकने की जरूरत नहीं है, जनरेटर के भावों के लिए धन्यवाद।
जेनरेटर एक्सप्रेशन सूची बोध के समान हैं। जेनरेटर एक्सप्रेशन जेनरेटर की तरह एक समय में एक आइटम उत्पन्न करते हैं। यह एक सूची समझ से अलग है जो एक ही समय में पूरी सूची तैयार करता है।
आइए हमारे कुकीज़ उदाहरण के लिए एक जनरेटर लिखें:
cookie_list =["रास्पबेरी", "चोक-चिप", "दालचीनी", "ओट"]cookie_generator =(कुकी_सूची में कुकी के लिए कुकी)
हमने वेरिएबल cookie_list
. में कुकी की एक सूची निर्धारित की है . फिर हम एक जनरेटर एक्सप्रेशन बनाते हैं। यह अभिव्यक्ति सूची की समझ के लिए सिंटैक्स का उपयोग करती है लेकिन एक बड़े अंतर के साथ:सूची की समझ वर्ग कोष्ठक के भीतर परिभाषित की जाती है, जबकि जनरेटर को गोल कोष्ठक के भीतर परिभाषित किया जाता है।
आइए एक लूप के लिए बनाएं जो अभिव्यक्ति पर पुनरावृत्त हो:
कुकी_जनरेटर में कुकी के लिए:प्रिंट (कुकी)
हमारा कोड लौटाता है:
रास्पबेरी
चोक-चिप
दालचीनी
जई
इस जनरेटर की प्रतिक्रिया हमारे पहले उदाहरण के समान है। हमारा सिंटैक्स काफी स्पष्ट है।
यह ध्यान रखना महत्वपूर्ण है कि जब आप एक जनरेटर पर पुनरावृति करते हैं जिसे जनरेटर अभिव्यक्ति का उपयोग करके घोषित किया गया था, तो आप इसे एक फ़ंक्शन के रूप में नहीं कहते हैं। हमारा cookie_generator
जनरेटर किसी भी इनपुट मान को स्वीकार नहीं करता है:इसमें पहले से ही वह कोड होता है जिसकी उसे cookie_list
पर पुनरावृति करने की आवश्यकता होती है सूची।
आपको जेनरेटर एक्सप्रेशन सिंटैक्स का उपयोग केवल तभी करना चाहिए जब आपको एक ऐसा जनरेटर लिखने की आवश्यकता हो जो एक साधारण कार्य करता हो। मूल्यों की सूची प्रिंट करना एक अच्छा उदाहरण है; किसी सूची में मानों को किसी विशिष्ट संख्या से गुणा करना एक और अच्छा उदाहरण है।
ऐसा इसलिए है क्योंकि जनरेटर अभिव्यक्ति सिंटैक्स स्पष्ट है, यह मुख्य रूप से एक-पंक्ति अभिव्यक्तियों के लिए डिज़ाइन किया गया है। यदि आपका जनरेटर कोड की एक से अधिक पंक्तियों का उपयोग करेगा, तो इसे इस लेख में पहले चर्चा किए गए सिंटैक्स का उपयोग करके जनरेटर फ़ंक्शन के रूप में लिखें।
जनरेटर का उपयोग क्यों किया जाता है?
जनरेटर का उपयोग करने का प्राथमिक कारण यह है कि वे पुनरावृत्तियों की तुलना में अधिक संक्षिप्त हैं।
जेनरेटर एक फंक्शन की तरह होते हैं और उन्हें काम करने के लिए किसी __init__, __iter__, या __next__ स्टेटमेंट की जरूरत नहीं होती है। यह एक पुनरावर्तक के विपरीत है जिसके लिए उन तीनों कथनों की आवश्यकता होती है। इस व्यवहार का मतलब है कि यदि आप एक पुनरावर्तक लिख रहे थे तो आप जेनरेटर को कोड की काफी कम पंक्तियों में कार्यान्वित कर सकते हैं।
इसके अलावा, जनरेटर मेमोरी का उपयोग करने में कुशल होते हैं। जनरेटर एक समय में केवल एक ही वस्तु का उत्पादन करते हैं। वे परिणाम वापस करने से पहले स्मृति में एक संपूर्ण अनुक्रम नहीं बनाते हैं। यदि आपको डेटा की एक बड़ी सूची पर पुनरावृति करने की आवश्यकता है तो यह जनरेटर को बहुत व्यावहारिक बनाता है।
जिस तरह से यह काम करता है वह यह है कि इटरेटर आलसी मूल्यांकन पद्धति का उपयोग करते हैं। जब उस आइटम का अनुरोध किया जाता है तो वे केवल एक पुनरावृत्त वस्तु का अगला तत्व उत्पन्न करते हैं।
निष्कर्ष (और चुनौती)
जेनरेटर आपको अधिक पाइथोनिक इटरेटर बनाने की अनुमति देते हैं।
जेनरेटर __init__, __iter__, या __next__ स्टेटमेंट लिखे बिना इटरेटर प्रोटोकॉल का उपयोग करके ऑब्जेक्ट लिखना आसान बनाते हैं। जनरेटर को कार्यों के रूप में परिभाषित किया गया है। वे एक जनरेटर को रोकने के लिए उपज विवरण का उपयोग करते हैं और अपने नियमित संचालन पर लौटने से पहले मुख्य कार्यक्रम में एक मूल्य वापस पास करते हैं।
यदि आप एक चुनौती की तलाश में हैं, तो यहां कुछ विचार दिए गए हैं:
- एक जनरेटर लिखें जो एक स्ट्रिंग को उलट देता है।
- एक जनरेटर लिखें जो मूल्यों की सूची से केवल एक विशिष्ट शब्द वाले मान लौटाता है।
- एक जनरेटर लिखें जो सूची में प्रत्येक संख्या को दो से गुणा करता है।
आगे पढ़ने के लिए, हमारे ट्यूटोरियल को देखें कि पायथन इटरेटर्स को कैसे लिखना और उपयोग करना है। अब आप एक विशेषज्ञ की तरह पायथन में जनरेटर के साथ काम करना शुरू करने के लिए तैयार हैं!