पाइथन में जेनरेटर एक शक्तिशाली विशेषता है, जो मानों के अनुक्रम उत्पन्न करने का एक स्मृति-कुशल तरीका प्रदान करती है। हालाँकि, पुनरावृति करने से पहले यह निर्धारित करना कि कोई जेनरेटर खाली है या नहीं, अन्य पुनरावृति योग्य प्रकारों की तुलना में कम सरल हो सकता है। यह लेख खाली जेनरेटर की जाँच करने के कुशल और प्रभावी तरीकों का पता लगाता है।
कुशलतापूर्वक खाली जेनरेटर की जाँच करना
सबसे कुशल विधि next()
फ़ंक्शन और अपवाद हैंडलिंग का लाभ उठाती है। next()
जेनरेटर से अगला आइटम पुनः प्राप्त करने का प्रयास करता है। यदि जेनरेटर खाली है, तो यह एक StopIteration
अपवाद उत्पन्न करता है, जिसे हम खालीपन निर्धारित करने के लिए पकड़ सकते हैं।
def my_generator(values):
for value in values:
yield value
gen = my_generator([1, 2, 3])
try:
next(gen)
is_empty = False
except StopIteration:
is_empty = True
print(f"Is the generator empty? {is_empty}") # Output: False
empty_gen = my_generator([])
try:
next(empty_gen)
is_empty = False
except StopIteration:
is_empty = True
print(f"Is the generator empty? {is_empty}") # Output: True
यह दृष्टिकोण इष्टतम है क्योंकि यह केवल एक आइटम को पुनः प्राप्त करने का प्रयास करता है। यदि जेनरेटर खाली नहीं है, तो यह एक तत्व का उपभोग करता है; अन्यथा, यह किसी का उपभोग नहीं करता है, जिससे यह अत्यधिक स्मृति कुशल बन जाता है।
कम कुशल विधियाँ (यदि संभव हो तो बचें)
एक वैकल्पिक दृष्टिकोण में list()
का उपयोग करके जेनरेटर को एक सूची में परिवर्तित करना और उसकी लंबाई की जाँच करना शामिल है। हालाँकि, यह विधि बड़े जेनरेटर के लिए काफी कम कुशल है क्योंकि यह संपूर्ण जेनरेटर को स्मृति में ले लेता है। इस विधि का उपयोग केवल तभी करें जब स्मृति एक प्राथमिक चिंता न हो और आपको जेनरेटर की सामग्री को सूची के रूप में भी चाहिए।
def my_generator(values):
for value in values:
yield value
gen = my_generator([1,2,3])
list_gen = list(gen)
is_empty = len(list_gen) == 0
print(f"Is the generator empty? {is_empty}") # Output: True (after consuming the generator)
empty_gen = my_generator([])
list_gen = list(empty_gen)
is_empty = len(list_gen) == 0
print(f"Is the generator empty? {is_empty}") # Output: True
सही दृष्टिकोण चुनना
अधिकांश परिदृश्यों के लिए, अपवाद हैंडलिंग विधि के साथ next()
को इसकी दक्षता के कारण दृढ़ता से अनुशंसित किया जाता है। यह अनावश्यक स्मृति खपत से बचाता है और केवल न्यूनतम रूप से जेनरेटर के साथ इंटरैक्ट करता है। सूची रूपांतरण विधि पर केवल तभी विचार किया जाना चाहिए जब आपको जेनरेटर की सामग्री को सूची के रूप में चाहिए और स्मृति उपयोग सीमित कारक नहीं है।
विशेष रूप से बड़े जेनरेटर के साथ काम करते समय, हमेशा सबसे अधिक स्मृति-कुशल समाधान को प्राथमिकता दें।
विषय सूची