python - पायथन खाली जनरेटर समारोह




generator (6)

आप एक जनरेटर में एक बार return उपयोग कर सकते हैं; यह कुछ भी पैदा किए बिना पुनरावृत्ति रोकता है, और इस प्रकार कार्य को दायरे से बाहर करने के लिए एक स्पष्ट विकल्प प्रदान करता है। तो फ़ंक्शन को जनरेटर में बदलने के लिए yield का उपयोग करें, लेकिन कुछ भी उत्पन्न करने से पहले जेनरेटर को समाप्त करने के लिए इसे return करें।

>>> def f():
...     return
...     yield
... 
>>> list(f())
[]

मुझे यकीन नहीं है कि यह आपके पास जितना बेहतर है - यह नो-ऑप yield स्टेटमेंट के साथ स्टेटमेंट को नो-ऑप बदल देता है। लेकिन यह अधिक मूर्खतापूर्ण है। ध्यान दें कि yield का उपयोग केवल काम नहीं करता है।

>>> def f():
...     yield
... 
>>> list(f())
[None]

क्यों न केवल iter(()) उपयोग करें?

यह सवाल विशेष रूप से खाली जनरेटर फ़ंक्शन के बारे में पूछता है। इसी कारण से, मैं इसे सामान्य रूप से खाली इटरेटर बनाने के सर्वोत्तम तरीके के बारे में एक प्रश्न के बजाय पाइथन के वाक्यविन्यास की आंतरिक स्थिरता के बारे में एक प्रश्न होने के लिए लेता हूं।

यदि प्रश्न वास्तव में खाली इटरेटर बनाने का सबसे अच्छा तरीका है, तो आप इसके बजाय iter(()) का उपयोग करने के बारे में Zectbumo सहमत हो सकते हैं। हालांकि, यह देखना महत्वपूर्ण है कि iter(()) कोई फ़ंक्शन वापस नहीं करता है! यह सीधे एक खाली पुनरावर्तनीय देता है। मान लें कि आप एक एपीआई के साथ काम कर रहे हैं जो एक कॉल करने योग्य की अपेक्षा करता है जो एक पुनरावर्तनीय लौटाता है । आपको ऐसा कुछ करना होगा:

def empty():
    return iter(())

(क्रेडिट को इस उत्तर का पहला सही संस्करण देने के लिए Unutbu जाना चाहिए।)

अब, आप उपर्युक्त स्पष्ट पा सकते हैं, लेकिन मैं ऐसी परिस्थितियों की कल्पना कर सकता हूं जिसमें यह कम स्पष्ट होगा। जनरेटर फ़ंक्शन परिभाषाओं की एक लंबी सूची (प्रदूषित) की इस सूची पर विचार करें:

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 आधारित कार्य अधिक पठनीय और रखरखाव योग्य हैं।

पायथन में, कोई व्यक्ति फ़ंक्शन के शरीर में उपज कीवर्ड डालकर आसानी से एक इटरेटर फ़ंक्शन को परिभाषित कर सकता है, जैसे कि:

def gen():
    for i in range(100):
        yield i

मैं जनरेटर फ़ंक्शन को कैसे परिभाषित कर सकता हूं जो कोई मान उत्पन्न नहीं करता है (0 मान उत्पन्न करता है), निम्न कोड काम नहीं करता है, क्योंकि पाइथन यह नहीं जान सकता कि यह जनरेटर होना चाहिए और सामान्य कार्य नहीं होना चाहिए:

def empty():
    pass

मैं कुछ ऐसा कर सकता था

def empty():
    if False:
        yield None

लेकिन वह बहुत बदसूरत होगा। क्या खाली इटरेटर फ़ंक्शन का एहसास करने का कोई अच्छा तरीका है?


आप में से उन लोगों के लिए जिन्हें वास्तव में एक फ़ंक्शन की आवश्यकता होती है और वास्तव में जनरेटर की आवश्यकता होती है

empty = lambda: (_ for _ in ())

एक खाली इटरेटर बनाने का "मानक" तरीका इटार ([]) प्रतीत होता है। मैंने [] को इसके लिए डिफ़ॉल्ट तर्क () बनाने का सुझाव दिया है; इसे अच्छे तर्कों से खारिज कर दिया गया था, http://bugs.python.org/issue25215 - जुर्जेन देखें


क्या यह जनरेटर फ़ंक्शन होना चाहिए? यदि नहीं, तो कैसे

def f():
    return iter([])

मैं निम्नलिखित पसंद करता हूं:

def foo():
  raise StopIteration()
  yield

"उपज" इसे जनरेटर में बदल देती है जबकि अपवाद का मतलब है कि परिणाम में कोई भी शामिल नहीं है (पूरी तरह खाली परिणाम)।


generator = (item for item in [])






generator