आप return
एक बार जनरेटर में उपयोग कर सकते हैं ; यह कुछ भी पैदावार के बिना पुनरावृत्ति को रोकता है, और इस प्रकार फ़ंक्शन को कार्यक्षेत्र से बाहर जाने देने के लिए एक स्पष्ट विकल्प प्रदान करता है। इसलिए yield
फ़ंक्शन को एक जनरेटर में बदलने के लिए उपयोग करें, लेकिन return
इससे पहले कि कुछ भी उपज से पहले जनरेटर को समाप्त करने के लिए पूर्ववर्ती करें ।
>>> def f():
... return
... yield
...
>>> list(f())
[]
मुझे यकीन नहीं है कि आपके पास जो है उससे बहुत बेहतर है - यह सिर्फ एक नो-ऑप if
स्टेटमेंट की जगह एक नो-ऑप स्टेटमेंट देता है yield
। लेकिन यह अधिक मुहावरेदार है। ध्यान दें कि बस का उपयोग करने से yield
काम नहीं होता है।
>>> def f():
... yield
...
>>> list(f())
[None]
सिर्फ उपयोग क्यों नहीं iter(())
?
यह प्रश्न विशेष रूप से एक खाली जनरेटर फ़ंक्शन के बारे में पूछता है । इस कारण से, मैं इसे सामान्य रूप से एक खाली पुनरावृत्ति बनाने के सर्वोत्तम तरीके के बारे में एक प्रश्न के बजाय, पायथन के सिंटैक्स की आंतरिक स्थिरता के बारे में एक प्रश्न के रूप में लेता हूं।
यदि प्रश्न वास्तव में एक खाली पुनरावृत्ति बनाने के सर्वोत्तम तरीके के बारे में है, तो आप iter(())
इसके बजाय Zectbumo के साथ उपयोग करने के बारे में सहमत हो सकते हैं । हालाँकि, यह देखना महत्वपूर्ण है कि iter(())
कोई फ़ंक्शन वापस नहीं करता है! यह सीधे एक खाली चलने योग्य रिटर्न देता है। मान लीजिए कि आप एक एपीआई के साथ काम कर रहे हैं जो एक कॉल करने योग्य की उम्मीद करता है जो एक पुनरावृत्ति देता है । आपको कुछ इस तरह करना होगा:
def empty():
return iter(())
( इस उत्तर के पहले सही संस्करण को देने के लिए क्रेडिट को Unutbu पर जाना चाहिए ।)
अब, आपको उपरोक्त स्पष्ट मिल सकता है, लेकिन मैं उन स्थितियों की कल्पना कर सकता हूं जिनमें यह कम स्पष्ट होगा। (Contrived) जनरेटर फ़ंक्शन परिभाषाओं की एक लंबी सूची के इस उदाहरण पर विचार करें:
def zeros():
while True:
yield 0
def ones():
while True:
yield 1
...
उस लंबी सूची के अंत में, मैं इसके साथ कुछ देखना yield
चाहूंगा, जैसे:
def empty():
return
yield
या, पायथन 3.3 और उससे ऊपर (जैसा कि DSM द्वारा सुझाया गया है ), यह:
def empty():
yield from ()
yield
कीवर्ड की उपस्थिति संक्षिप्त नज़र में यह स्पष्ट करती है कि यह अन्य जनरेटर की तरह ही एक और जनरेटर फ़ंक्शन है। यह देखने के लिए थोड़ा और समय लगता है कि iter(())
संस्करण एक ही काम कर रहा है।
यह एक सूक्ष्म अंतर है, लेकिन मैं ईमानदारी से सोचता हूं कि- yield
आधारित कार्य अधिक पठनीय और बनाए रखने योग्य हैं।
if False: yield
लेकिन अभी भी थोड़े भ्रमित हैं, जो इस पैटर्न को नहीं जानते हैं