2011-06-06 28 views
13

मेरे पास एक पाइथन जनरेटर है जो उपज के लिए अधिक तत्व प्राप्त करने के लिए स्वयं को कॉल कर सकता है। ऐसा लगता है:पायथन जनरेटर किसी अन्य जेनरेटर कॉल से सबकुछ पैदा करने के लिए

def gen(list): 
    # ... 
    if list: 
     for x in gen(list[1:]): 
      yield x 

मेरा प्रश्न पिछले दो पंक्तियों के बारे में है: क्या यह व्यक्त करने का एक और संक्षिप्त तरीका है? मैं कुछ इस तरह के लिए उम्मीद कर रहा हूँ (समझने यह वैध अजगर के रूप में है नहीं है):

def gen(list): 
    # ... 
    if list: 
     yield each in gen(list[1:]) 
+0

मुझे यह नहीं मिलता कि यह क्या करना है, मैंने मूल रूप से सोचा था कि यह एक जनरेटर को सूची बदलने का एक बेवकूफ तरीका था लेकिन मुझे गलत था। क्या आप मुझे प्रबुद्ध कर सकते हैं? – Davy8

+0

अगर मैं गलत हूं तो मुझे सही करें, लेकिन वह कोड ऐसा लगता है कि यह हमेशा खाली सूची लौटाएगा। मुझे लगता है कि टिप्पणी में अन्य उपज होना चाहिए? – Dunes

+0

@ ड्यून्स: हाँ, टिप्पणी में अन्य उपज हैं। –

उत्तर

17

yield from के लिए कुछ कॉल किया गया है या ऐसा लगता है कि सबजेनरेटर द्वारा लौटाए गए सभी मानों को "गुजरता है"। कुछ विचारों के लिए PEP 380 देखें जो आसपास बाउंस किए गए हैं। हालांकि, अभी तक कुछ भी लागू नहीं किया गया है। आपका पहला उदाहरण सही है।

+4

नोट: पीईपी 380 (उपज) के साथ पाइथन 3.3 जारी किया गया है। – jomido

+1

अब यह ईमानदार है! – kindall

+2

... लेकिन पायथन 2.x में नहीं – smci

3

आपका पहला उदाहरण उचित समाधान है।

5

आपका कोड नमूना बहुत ही मूर्ख और संक्षिप्त है, कोई आवश्यकता नहीं है और आगे के सुधारों के लिए कोई वास्तविक मौका नहीं है और विशेष रूप से जब यह पठनीयता पर आता है।