2012-05-16 61 views
22

मैं पाइथन में अधिकतर विशेष रूप से yield ऑपरेटर के साथ खेल रहा था। विकास संचालित परीक्षण का उपयोग करते समय एक नया iterable लेखन शुरू करने, मैंने सोचा कम से कम कोड है कि पारित करने के लिए एक iterable के लिए यह साधारण परीक्षण कर सकता है क्या है:पायथन में उपज का उपयोग करके रिक्त पुनरावृत्ति बनाने का सबसे आसान तरीका क्या है?

def test(): 
    for x in my_iterable(): 
     pass 

कम से कम संस्करण मैं के बारे में सोच सकता था:

def my_iterable(): 
    for i in []: 
     yield i 

क्या यह एक सरल, छोटा या अधिक सुंदर (पायथनिक) संस्करण लिखना संभव है?

+1

ध्यान दें कि यदि आपका परीक्षण अस्थिर है और कुछ भी उत्पन्न नहीं करता है - जैसा कि दिखाया गया है और अधिकांश या सभी उत्तरों में - आपका परीक्षण 'लूप' में किसी भी कोड का प्रयोग नहीं करेगा। – martineau

उत्तर

18

हाँ, वहाँ है:

return iter([]) 
+1

यह अच्छा है लेकिन मुझे मिला: 'उपज' रखने के लिए 'F999' चेतावनी – lang2

11

आप पाइथन में खाली पुनरावर्तनीय बनाने के लिए लैम्ब्डा और इटर फ़ंक्शंस का उपयोग कर सकते हैं।

my_iterable = lambda: iter(()) 
1
def do_yield(): 
    return 
    yield None 

अगर yield के उपयोग आप के लिए महत्वपूर्ण है, अन्य उत्तर अन्यथा में से एक।

+0

+1। यद्यपि बहुत पठनीय नहीं है। :-) –

6

कैसे

के बारे में
my_iterable = str 

इस अपने परीक्षण गुजरता है।

गंभीरता से बात करने के लिए, collections module में Iterable प्रदान करता है:

def __iter__(self): 
    while False: 
     yield None 

यह माना जा सकता है "सबसे pythonic" क्योंकि यह है कि क्या अजगर ही उपयोग करता है।

ध्यान दें कि तकनीकी रूप से सभी जवाब अब तक iterators (__iter__ + next) प्रदान करते हैं नहीं iterables (बस __iter__)।

+0

पायथन मानक पुस्तकालय के संदर्भ के कारण स्वीकृत। –

0

एक और जवाब, क्योंकि मैं एक अलग दृष्टिकोण के साथ एक पूरी तरह से नया समाधान प्रदान करता हूं।

  • अनुक्रम प्रोटोकॉल के माध्यम से वैकल्पिक यात्रा (here देखें):

    पुस्तकालयों द्वारा से एक में, मैं एक EmptyIterator ऐसे

    रूप
    class EmptyIter(object): 
        __name__ = 'EmptyIter' 
        """Iterable which is False and empty""" 
        def __len__(self): return 0 
        def next(self): raise StopIteration # even that is redundant 
        def __getitem__(self, index): raise IndexError 
    

    यह एक वैकल्पिक दृष्टिकोण जो निम्नलिखित गुण का उपयोग करता है

  • वैकल्पिक "गलतता" प्रोटोकॉल जैसा कि here वर्णित है।

    def empty_gen(): 
        yield from() 
    

    कौन सा पढ़ी जा सकती है, और empty_gen एक जनरेटर के रूप में रखने के लिए:

5

एक अन्य समाधान, अजगर 3 में, नए yield from सिंटैक्स का उपयोग करने के लिए है।

+1

** यह है। ** जबकि लैम्ब्डा: इटर (()) जैसे जवाब चतुरता के लिए मनुष्य की सहज ड्राइव को संतुष्ट करते हैं, वे भी अपठनीय हैं और वास्तविक * जेनरेटर उत्पन्न करने में असफल होते हैं। * विशेष रूप से, 'इंस्टेंसेंस (इटर (()), प्रकार। जनरेटर टाइप) == झूठी'। ['Mypy'] की सापेक्ष सफलता के रूप में (http://mypy-lang.org/) दिखाता है, कभी-कभी * डू * पदार्थ टाइप करता है। हमेशा 'उपज', पायथन 3 लोग। –