2010-07-11 15 views
20

मैं एक जनरेटर समारोह है और यह से पहले दस आइटम प्राप्त करना चाहते हैं के एक सबसेट हो जाओ; मेरा पहला प्रयास था:एक जनरेटर

my_generator()[:10] 

यह काम नहीं करता है क्योंकि जनरेटर सबस्क्रिप्ट करने योग्य नहीं हैं, क्योंकि त्रुटि मुझे बताती है। अभी मैंने इसके साथ काम किया है:

list(my_generator())[:10] 

यह काम करता है क्योंकि यह जेनरेटर को एक सूची में परिवर्तित करता है; हालांकि, यह एक जनरेटर होने के बिंदु को अक्षम और पराजित करता है। क्या जेनरेटर के लिए [:10] के कुछ अंतर्निहित, पायथनिक समकक्ष हैं?

उत्तर

25
import itertools 

itertools.islice(mygenerator(), 10) 

itertools में इटरेटर के साथ काम करने के लिए कई सुविधाएं हैं। islice एक इटरेटर को टुकड़ा करने के लिए प्रारंभ, रोकें और चरण तर्क लेता है जैसे आप एक सूची टुकड़ा करेंगे।

+1

वास्तव में उपयोग करें: itertools.islice (mygenerator(), 10) – Martlark

+0

@martlark: Uhm, कोई नेड सही संस्करण था। – SilentGhost

+1

@SilentGhost अच्छी तरह से, जब मैंने कोशिश की तो मुझे यह त्रुटि मिली: आयात itertools def sumUp(): x = 20; z = 0 रेंज में y के लिए (x + 1): z + = 1 उपज z itertools.islice में जेड के लिए (sumUp, 5): प्रिंट z Traceback (सबसे हाल कॉल पिछले): फ़ाइल "C: \ Data \ कोड \ Febrl \ src \ z.py", लाइन 9, itertools.islice में z के लिए में (sumUp, 5): लेखन त्रुटि: 'समारोह' वस्तु iterable नहीं है अजगर 2.6 – Martlark

5

ऊपर टिप्पणियां स्पष्ट करने के लिए:

from itertools import islice 

def fib_gen(): 
    a, b = 1, 1 
    while True: 
     yield a 
     a, b = b, a + b 

assert [1, 1, 2, 3, 5] == list(islice(fib_gen(), 5)) 
+0

+1। –

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