2012-04-11 24 views
8

बेहतर मैं itertools मॉड्यूल में सुविधाओं को लागू करने की कोशिश कर रहा हूँ पायथन के जनरेटर समझते हैं, और izip के साथ मुसीबत में पाने के लिए:izip() का यह कार्यान्वयन क्यों काम नहीं करता है?

def izip(*iterables): 
    its = tuple(iter(it) for it in iterables) 
    while True: 
     yield tuple(next(it) for it in its) # ERROR 
     # yield tuple(map(next, its)) # OK 

मेरे कोड त्रुटि लाइन, और संदर्भ कार्यान्वयन (मैनुअल में दी गयी है) का उपयोग करता है अन्य छोटे मतभेदों पर विचार नहीं करते, ठीक रेखा का उपयोग करता है।

for x in izip([1, 2, 3], (4, 5)): 
    print x 

मेरे कोड आउटपुट:

(1, 4) 
(2, 5) 
(3,) 
() 
() 
... # indefinite() 

है, जबकि उम्मीद उत्पादन होता है:

(1, 4) 
(2, 5) 

क्या, कृपया मेरी कोड के साथ गलत क्या है इस स्निपेट के साथ?

उत्तर

12

कारण अपने कार्यान्वयन काम नहीं करता है, क्योंकि StopIteration iterables समाप्त किया जा रहा से एक के कारण अपवाद एक जनरेटर अभिव्यक्ति अंदर फेंक दिया है। यह केवल जेनरेटर अभिव्यक्ति को समाप्त कर देगा, न कि संलग्न जनरेटर फ़ंक्शन।

+2

@wdscxsj: देखें http://www.velocityreviews.com/forums/t723967- जनरेटर- एक्सप्रेशन- vs-comprehensions.html –

+0

@ स्वेन मार्नच: धन्यवाद! आपकी व्याख्या संक्षेप में और बहुत ही कम है। – wdscxsj

+0

@ स्टेवेन रूंबास्की: लिंक किया गया पृष्ठ मुझे और अधिक बेहतर समझने में मदद करता है। धन्यवाद! – wdscxsj

संबंधित मुद्दे